Your IP : 216.73.217.112


Current Path : /home/a/n/n/annegardxb/www/so-assurances/
Upload File :
Current File : /home/a/n/n/annegardxb/www/so-assurances/content.zip

PK�j&]�)��pagebreak/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]f ph��pagebreak/tmpl/toc.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @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;
?>
<div class="pull-right article-index">

	<?php if ($headingtext) : ?>
	<h3><?php echo $headingtext; ?></h3>
	<?php endif; ?>

	<ul class="nav nav-tabs nav-stacked">
	<?php foreach ($list as $listItem) : ?>
		<?php $class = $listItem->liClass ? ' class="' . $listItem->liClass . '"' : ''; ?>
		<li<?php echo $class; ?>>
			<a href="<?php echo $listItem->link; ?>" class="<?php echo $listItem->class; ?>">
				<?php echo $listItem->title; ?>
			</a>
		</li>
	<?php endforeach; ?>
	</ul>
</div>
PK�j&]�54س�pagebreak/tmpl/navigation.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @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;

$lang = JFactory::getLanguage();
?>
<ul>
	<li>
		<?php if ($links['previous']) :
		$direction = $lang->isRtl() ? 'right' : 'left';
		$title = htmlspecialchars($this->list[$page]->title, ENT_QUOTES, 'UTF-8');
		$ariaLabel = JText::_('JPREVIOUS') . ': ' . $title . ' (' . JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', $page, $n) . ')';
		?>
		<a href="<?php echo $links['previous']; ?>" title="<?php echo $title; ?>" aria-label="<?php echo $ariaLabel; ?>" rel="prev">
			<?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span> ' . JText::_('JPREV'); ?>
		</a>
		<?php endif; ?>
	</li>
	<li>
		<?php if ($links['next']) :
		$direction = $lang->isRtl() ? 'left' : 'right';
		$title = htmlspecialchars($this->list[$page + 2]->title, ENT_QUOTES, 'UTF-8');
		$ariaLabel = JText::_('JNEXT') . ': ' . $title . ' (' . JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', ($page + 2), $n) . ')';
		?>
		<a href="<?php echo $links['next']; ?>" title="<?php echo $title; ?>" aria-label="<?php echo $ariaLabel; ?>" rel="next">
			<?php echo JText::_('JNEXT') . ' <span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?>
		</a>
		<?php endif; ?>
	</li>
</ul>
PK�j&]��^pagebreak/pagebreak.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_pagebreak</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>PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="pagebreak">pagebreak.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_pagebreak.ini</language>
		<language tag="en-GB">en-GB.plg_content_pagebreak.sys.ini</language>
	</languages>
	<config>
		<fields name="params">

			<fieldset name="basic">
				<field
					name="title"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_SITE_TITLE_LABEL"
					description="PLG_CONTENT_PAGEBREAK_SITE_TITLE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="article_index"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_LABEL"
					description="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="article_index_text"
					type="text"
					label="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT"
					description="PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT_DESC"
					showon="article_index:1"
				/>

				<field
					name="multipage_toc"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_TOC_LABEL"
					description="PLG_CONTENT_PAGEBREAK_TOC_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="showall"
					type="radio"
					label="PLG_CONTENT_PAGEBREAK_SHOW_ALL_LABEL"
					description="PLG_CONTENT_PAGEBREAK_SHOW_ALL_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="style"
					type="list"
					label="PLG_CONTENT_PAGEBREAK_STYLE_LABEL"
					description="PLG_CONTENT_PAGEBREAK_STYLE_DESC"
					default="pages"
					>
					<option value="pages">PLG_CONTENT_PAGEBREAK_PAGES</option>
					<option value="sliders">PLG_CONTENT_PAGEBREAK_SLIDERS</option>
					<option value="tabs">PLG_CONTENT_PAGEBREAK_TABS</option>
				</field>
			</fieldset>

		</fields>
	</config>
</extension>
PK�j&]}$*�%�%pagebreak/pagebreak.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @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;

jimport('joomla.utilities.utility');

JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

/**
 * Page break plugin
 *
 * <b>Usage:</b>
 * <code><hr class="system-pagebreak" /></code>
 * <code><hr class="system-pagebreak" title="The page title" /></code>
 * or
 * <code><hr class="system-pagebreak" alt="The first page" /></code>
 * or
 * <code><hr class="system-pagebreak" title="The page title" alt="The first page" /></code>
 * or
 * <code><hr class="system-pagebreak" alt="The first page" title="The page title" /></code>
 *
 * @since  1.6
 */
class PlgContentPagebreak extends JPlugin
{
	/**
	 * The navigation list with all page objects if parameter 'multipage_toc' is active.
	 *
	 * @var    array
	 * @since  3.9.2
	 */
	protected $list = array();

	/**
	 * Plugin that adds a pagebreak into the text and truncates text at that point
	 *
	 * @param   string   $context  The context of the content being passed to the plugin.
	 * @param   object   &$row     The article object.  Note $article->text is also available
	 * @param   mixed    &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  mixed  Always returns void or true
	 *
	 * @since   1.6
	 */
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
		$canProceed = $context === 'com_content.article';

		if (!$canProceed)
		{
			return;
		}

		$style = $this->params->get('style', 'pages');

		// Expression to search for.
		$regex = '#<hr(.*)class="system-pagebreak"(.*)\/>#iU';

		$input = JFactory::getApplication()->input;

		$print = $input->getBool('print');
		$showall = $input->getBool('showall');

		if (!$this->params->get('enabled', 1))
		{
			$print = true;
		}

		if ($print)
		{
			$row->text = preg_replace($regex, '<br />', $row->text);

			return true;
		}

		// Simple performance check to determine whether bot should process further.
		if (StringHelper::strpos($row->text, 'class="system-pagebreak') === false)
		{
			if ($page > 0)
			{
				throw new Exception(JText::_('JERROR_PAGE_NOT_FOUND'), 404);
			}

			return true;
		}

		$view = $input->getString('view');
		$full = $input->getBool('fullview');

		if (!$page)
		{
			$page = 0;
		}

		if ($full || $view !== 'article' || $params->get('intro_only') || $params->get('popup'))
		{
			$row->text = preg_replace($regex, '', $row->text);

			return;
		}

		// Load plugin language files only when needed (ex: not needed if no system-pagebreak class exists).
		$this->loadLanguage();

		// Find all instances of plugin and put in $matches.
		$matches = array();
		preg_match_all($regex, $row->text, $matches, PREG_SET_ORDER);

		if ($showall && $this->params->get('showall', 1))
		{
			$hasToc = $this->params->get('multipage_toc', 1);

			if ($hasToc)
			{
				// Display TOC.
				$page = 1;
				$this->_createToc($row, $matches, $page);
			}
			else
			{
				$row->toc = '';
			}

			$row->text = preg_replace($regex, '<br />', $row->text);

			return true;
		}

		// Split the text around the plugin.
		$text = preg_split($regex, $row->text);

		if (!isset($text[$page]))
		{
			throw new Exception(JText::_('JERROR_PAGE_NOT_FOUND'), 404);
		}

		// Count the number of pages.
		$n = count($text);

		// We have found at least one plugin, therefore at least 2 pages.
		if ($n > 1)
		{
			$title  = $this->params->get('title', 1);
			$hasToc = $this->params->get('multipage_toc', 1);

			// Adds heading or title to <site> Title.
			if ($title && $page && isset($matches[$page - 1][0]))
			{
				$attrs = JUtility::parseAttributes($matches[$page - 1][0]);

				if (isset($attrs['title']))
				{
					$row->page_title = $attrs['title'];
				}
			}

			// Reset the text, we already hold it in the $text array.
			$row->text = '';

			if ($style === 'pages')
			{
				// Display TOC.
				if ($hasToc)
				{
					$this->_createToc($row, $matches, $page);
				}
				else
				{
					$row->toc = '';
				}

				// Traditional mos page navigation
				$pageNav = new JPagination($n, $page, 1);

				// Flag indicates to not add limitstart=0 to URL
				$pageNav->hideEmptyLimitstart = true;

				// Page counter.
				$row->text .= '<div class="pagenavcounter">';
				$row->text .= $pageNav->getPagesCounter();
				$row->text .= '</div>';

				// Page text.
				$text[$page] = str_replace('<hr id="system-readmore" />', '', $text[$page]);
				$row->text .= $text[$page];

				// $row->text .= '<br />';
				$row->text .= '<div class="pager">';

				// Adds navigation between pages to bottom of text.
				if ($hasToc)
				{
					$this->_createNavigation($row, $page, $n);
				}

				// Page links shown at bottom of page if TOC disabled.
				if (!$hasToc)
				{
					$row->text .= $pageNav->getPagesLinks();
				}

				$row->text .= '</div>';
			}
			else
			{
				$t[] = $text[0];

				$t[] = (string) JHtml::_($style . '.start', 'article' . $row->id . '-' . $style);

				foreach ($text as $key => $subtext)
				{
					if ($key >= 1)
					{
						$match = $matches[$key - 1];
						$match = (array) JUtility::parseAttributes($match[0]);

						if (isset($match['alt']))
						{
							$title = stripslashes($match['alt']);
						}
						elseif (isset($match['title']))
						{
							$title = stripslashes($match['title']);
						}
						else
						{
							$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $key + 1);
						}

						$t[] = (string) JHtml::_($style . '.panel', $title, 'article' . $row->id . '-' . $style . $key);
					}

					$t[] = (string) $subtext;
				}

				$t[] = (string) JHtml::_($style . '.end');

				$row->text = implode(' ', $t);
			}
		}

		return true;
	}

	/**
	 * Creates a Table of Contents for the pagebreak
	 *
	 * @param   object   &$row      The article object.  Note $article->text is also available
	 * @param   array    &$matches  Array of matches of a regex in onContentPrepare
	 * @param   integer  &$page     The 'page' number
	 *
	 * @return  void
	 *
	 * @since  1.6
	 */
	protected function _createToc(&$row, &$matches, &$page)
	{
		$heading     = isset($row->title) ? $row->title : JText::_('PLG_CONTENT_PAGEBREAK_NO_TITLE');
		$input       = JFactory::getApplication()->input;
		$limitstart  = $input->getUInt('limitstart', 0);
		$showall     = $input->getInt('showall', 0);
		$headingtext = '';

		if ($this->params->get('article_index', 1) == 1)
		{
			$headingtext = JText::_('PLG_CONTENT_PAGEBREAK_ARTICLE_INDEX');

			if ($this->params->get('article_index_text'))
			{
				$headingtext = htmlspecialchars($this->params->get('article_index_text'), ENT_QUOTES, 'UTF-8');
			}
		}

		// TOC first Page link.
		$this->list[1]          = new stdClass;
		$this->list[1]->liClass = ($limitstart === 0 && $showall === 0) ? 'toclink active' : 'toclink';
		$this->list[1]->class   = $this->list[1]->liClass;
		$this->list[1]->link    = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language));
		$this->list[1]->title   = $heading;

		$i = 2;

		foreach ($matches as $bot)
		{
			if (@$bot[0])
			{
				$attrs2 = JUtility::parseAttributes($bot[0]);

				if (@$attrs2['alt'])
				{
					$title = stripslashes($attrs2['alt']);
				}
				elseif (@$attrs2['title'])
				{
					$title = stripslashes($attrs2['title']);
				}
				else
				{
					$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i);
				}
			}
			else
			{
				$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i);
			}

			$this->list[$i]          = new stdClass;
			$this->list[$i]->link    = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($i - 1));
			$this->list[$i]->title   = $title;
			$this->list[$i]->liClass = ($limitstart === $i - 1) ? 'active' : '';
			$this->list[$i]->class   = ($limitstart === $i - 1) ? 'toclink active' : 'toclink';

			$i++;
		}

		if ($this->params->get('showall'))
		{
			$this->list[$i]          = new stdClass;
			$this->list[$i]->link    = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&showall=1');
			$this->list[$i]->liClass = ($showall === 1) ? 'active' : '';
			$this->list[$i]->class   = ($showall === 1) ? 'toclink active' : 'toclink';
			$this->list[$i]->title   = JText::_('PLG_CONTENT_PAGEBREAK_ALL_PAGES');
		}

		$list = $this->list;
		$path = JPluginHelper::getLayoutPath('content', 'pagebreak', 'toc');
		ob_start();
		include $path;
		$row->toc = ob_get_clean();
	}

	/**
	 * Creates the navigation for the item
	 *
	 * @param   object  &$row  The article object.  Note $article->text is also available
	 * @param   int     $page  The page number
	 * @param   int     $n     The total number of pages
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function _createNavigation(&$row, $page, $n)
	{
		$links = array(
			'next' => '',
			'previous' => ''
		);

		if ($page < $n - 1)
		{
			$links['next'] = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($page + 1));
		}

		if ($page > 0)
		{
			$links['previous'] = ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language);

			if ($page > 1)
			{
				$links['previous'] .= '&limitstart=' . ($page - 1);
			}

			$links['previous'] = JRoute::_($links['previous']);
		}

		$path = JPluginHelper::getLayoutPath('content', 'pagebreak', 'navigation');
		ob_start();
		include $path;
		$row->text .= ob_get_clean();
	}
}
PK�j&]�)��contact/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]=�S���contact/contact.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.Contact
 *
 * @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\Registry\Registry;

/**
 * Contact Plugin
 *
 * @since  3.2
 */
class PlgContentContact extends JPlugin
{
	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 * @since  3.3
	 */
	protected $db;

	/**
	 * Plugin that retrieves contact information for contact
	 *
	 * @param   string   $context  The context of the content being passed to the plugin.
	 * @param   mixed    &$row     An object with a "text" property
	 * @param   mixed    $params   Additional parameters. See {@see PlgContentContent()}.
	 * @param   integer  $page     Optional page number. Unused. Defaults to zero.
	 *
	 * @return  boolean	True on success.
	 */
	public function onContentPrepare($context, &$row, $params, $page = 0)
	{
		$allowed_contexts = array('com_content.category', 'com_content.article', 'com_content.featured');

		if (!in_array($context, $allowed_contexts))
		{
			return true;
		}

		// Return if we don't have valid params or don't link the author
		if (!($params instanceof Registry) || !$params->get('link_author'))
		{
			return true;
		}

		// Return if an alias is used
		if ((int) $this->params->get('link_to_alias', 0) === 0 && $row->created_by_alias != '')
		{
			return true;
		}

		// Return if we don't have a valid article id
		if (!isset($row->id) || !(int) $row->id)
		{
			return true;
		}

		$contact        = $this->getContactData($row->created_by);
		$row->contactid = $contact->contactid;
		$row->webpage   = $contact->webpage;
		$row->email     = $contact->email_to;
		$url            = $this->params->get('url', 'url');

		if ($row->contactid && $url === 'url')
		{
			JLoader::register('ContactHelperRoute', JPATH_SITE . '/components/com_contact/helpers/route.php');
			$row->contact_link = JRoute::_(ContactHelperRoute::getContactRoute($contact->contactid . ':' . $contact->alias, $contact->catid));
		}
		elseif ($row->webpage && $url === 'webpage')
		{
			$row->contact_link = $row->webpage;
		}
		elseif ($row->email && $url === 'email')
		{
			$row->contact_link = 'mailto:' . $row->email;
		}
		else
		{
			$row->contact_link = '';
		}

		return true;
	}

	/**
	 * Retrieve Contact
	 *
	 * @param   int  $userId  Id of the user who created the article
	 *
	 * @return  mixed|null|integer
	 */
	protected function getContactData($userId)
	{
		static $contacts = array();

		if (isset($contacts[$userId]))
		{
			return $contacts[$userId];
		}

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

		$query->select('MAX(contact.id) AS contactid, contact.alias, contact.catid, contact.webpage, contact.email_to');
		$query->from($this->db->quoteName('#__contact_details', 'contact'));
		$query->where('contact.published = 1');
		$query->where('contact.user_id = ' . (int) $userId);

		if (JLanguageMultilang::isEnabled() === true)
		{
			$query->where('(contact.language in '
				. '(' . $this->db->quote(JFactory::getLanguage()->getTag()) . ',' . $this->db->quote('*') . ') '
				. ' OR contact.language IS NULL)');
		}

		$this->db->setQuery($query);

		$contacts[$userId] = $this->db->loadObject();

		return $contacts[$userId];
	}
}
PK�j&]�=�bbcontact/contact.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="content" method="upgrade">
	<name>plg_content_contact</name>
	<author>Joomla! Project</author>
	<creationDate>January 2014</creationDate>
	<copyright>(C) 2014 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.2</version>
	<description>PLG_CONTENT_CONTACT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="contact">contact.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_contact.ini</language>
		<language tag="en-GB">en-GB.plg_content_contact.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="url"
					type="list"
					label="PLG_CONTENT_CONTACT_PARAM_URL_LABEL"
					description="PLG_CONTENT_CONTACT_PARAM_URL_DESCRIPTION"
					default="url"
					>
					<option value="url">PLG_CONTENT_CONTACT_PARAM_URL_URL</option>
					<option value="webpage">PLG_CONTENT_CONTACT_PARAM_URL_WEBPAGE</option>
					<option value="email">PLG_CONTENT_CONTACT_PARAM_URL_EMAIL</option>
				</field>

				<field
					name="link_to_alias"
					type="radio"
					label="PLG_CONTENT_CONTACT_PARAM_ALIAS_LABEL"
					description="PLG_CONTENT_CONTACT_PARAM_ALIAS_DESCRIPTION"
					default="0"
					class="btn-group btn-group-yesno"
					filter="integer"
					>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]�)��loadmodule/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�[z6��loadmodule/loadmodule.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_loadmodule</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>PLG_LOADMODULE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="loadmodule">loadmodule.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_loadmodule.ini</language>
		<language tag="en-GB">en-GB.plg_content_loadmodule.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="style"
					type="list"
					label="PLG_LOADMODULE_FIELD_STYLE_LABEL"
					description="PLG_LOADMODULE_FIELD_STYLE_DESC"
					default="table"
					>
					<option value="table">PLG_LOADMODULE_FIELD_VALUE_TABLE</option>
					<option value="horz">PLG_LOADMODULE_FIELD_VALUE_HORIZONTAL</option>
					<option value="xhtml">PLG_LOADMODULE_FIELD_VALUE_DIVS</option>
					<option value="rounded">PLG_LOADMODULE_FIELD_VALUE_MULTIPLEDIVS</option>
					<option value="none">PLG_LOADMODULE_FIELD_VALUE_RAW</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]Ձ�$��loadmodule/loadmodule.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.loadmodule
 *
 * @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;

/**
 * Plugin to enable loading modules into content (e.g. articles)
 * This uses the {loadmodule} syntax
 *
 * @since  1.5
 */
class PlgContentLoadmodule extends JPlugin
{
	protected static $modules = array();

	protected static $mods = array();

	/**
	 * Plugin that loads module positions within content
	 *
	 * @param   string   $context   The context of the content being passed to the plugin.
	 * @param   object   &$article  The article object.  Note $article->text is also available
	 * @param   mixed    &$params   The article params
	 * @param   integer  $page      The 'page' number
	 *
	 * @return  mixed   true if there is an error. Void otherwise.
	 *
	 * @since   1.6
	 */
	public function onContentPrepare($context, &$article, &$params, $page = 0)
	{
		// Don't run this plugin when the content is being indexed
		if ($context === 'com_finder.indexer')
		{
			return true;
		}

		// Simple performance check to determine whether bot should process further
		if (strpos($article->text, 'loadposition') === false && strpos($article->text, 'loadmodule') === false)
		{
			return true;
		}

		// Expression to search for (positions)
		$regex = '/{loadposition\s(.*?)}/i';
		$style = $this->params->def('style', 'none');

		// Expression to search for(modules)
		$regexmod = '/{loadmodule\s(.*?)}/i';
		$stylemod = $this->params->def('style', 'none');

		// Expression to search for(id)
		$regexmodid = '/{loadmoduleid\s([1-9][0-9]*)}/i';

		// Find all instances of plugin and put in $matches for loadposition
		// $matches[0] is full pattern match, $matches[1] is the position
		preg_match_all($regex, $article->text, $matches, PREG_SET_ORDER);

		// No matches, skip this
		if ($matches)
		{
			foreach ($matches as $match)
			{
				$matcheslist = explode(',', $match[1]);

				// We may not have a module style so fall back to the plugin default.
				if (!array_key_exists(1, $matcheslist))
				{
					$matcheslist[1] = $style;
				}

				$position = trim($matcheslist[0]);
				$style    = trim($matcheslist[1]);

				$output = $this->_load($position, $style);

				// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
				if (($start = strpos($article->text, $match[0])) !== false)
				{
					$article->text = substr_replace($article->text, $output, $start, strlen($match[0]));
				}

				$style = $this->params->def('style', 'none');
			}
		}

		// Find all instances of plugin and put in $matchesmod for loadmodule
		preg_match_all($regexmod, $article->text, $matchesmod, PREG_SET_ORDER);

		// If no matches, skip this
		if ($matchesmod)
		{
			foreach ($matchesmod as $matchmod)
			{
				$matchesmodlist = explode(',', $matchmod[1]);

				// We may not have a specific module so set to null
				if (!array_key_exists(1, $matchesmodlist))
				{
					$matchesmodlist[1] = null;
				}

				// We may not have a module style so fall back to the plugin default.
				if (!array_key_exists(2, $matchesmodlist))
				{
					$matchesmodlist[2] = $stylemod;
				}

				$module = trim($matchesmodlist[0]);
				$name   = htmlspecialchars_decode(trim($matchesmodlist[1]));
				$stylemod  = trim($matchesmodlist[2]);

				// $match[0] is full pattern match, $match[1] is the module,$match[2] is the title
				$output = $this->_loadmod($module, $name, $stylemod);

				// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
				if (($start = strpos($article->text, $matchmod[0])) !== false)
				{
					$article->text = substr_replace($article->text, $output, $start, strlen($matchmod[0]));
				}

				$stylemod = $this->params->def('style', 'none');
			}
		}

		// Find all instances of plugin and put in $matchesmodid for loadmoduleid
		preg_match_all($regexmodid, $article->text, $matchesmodid, PREG_SET_ORDER);

		// If no matches, skip this
		if ($matchesmodid)
		{
			foreach ($matchesmodid as $match)
			{
				$id     = trim($match[1]);
				$output = $this->_loadid($id);

				// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
				if (($start = strpos($article->text, $match[0])) !== false)
				{
					$article->text = substr_replace($article->text, $output, $start, strlen($match[0]));
				}

				$style = $this->params->def('style', 'none');
			}
		}
	}

	/**
	 * Loads and renders the module
	 *
	 * @param   string  $position  The position assigned to the module
	 * @param   string  $style     The style assigned to the module
	 *
	 * @return  mixed
	 *
	 * @since   1.6
	 */
	protected function _load($position, $style = 'none')
	{
		self::$modules[$position] = '';
		$document = JFactory::getDocument();
		$renderer = $document->loadRenderer('module');
		$modules  = JModuleHelper::getModules($position);
		$params   = array('style' => $style);
		ob_start();

		foreach ($modules as $module)
		{
			echo $renderer->render($module, $params);
		}

		self::$modules[$position] = ob_get_clean();

		return self::$modules[$position];
	}

	/**
	 * This is always going to get the first instance of the module type unless
	 * there is a title.
	 *
	 * @param   string  $module  The module title
	 * @param   string  $title   The title of the module
	 * @param   string  $style   The style of the module
	 *
	 * @return  mixed
	 *
	 * @since   1.6
	 */
	protected function _loadmod($module, $title, $style = 'none')
	{
		self::$mods[$module] = '';
		$document = JFactory::getDocument();
		$renderer = $document->loadRenderer('module');
		$mod      = JModuleHelper::getModule($module, $title);

		// If the module without the mod_ isn't found, try it with mod_.
		// This allows people to enter it either way in the content
		if (!isset($mod))
		{
			$name = 'mod_' . $module;
			$mod  = JModuleHelper::getModule($name, $title);
		}

		$params = array('style' => $style);
		ob_start();

		if ($mod->id)
		{
			echo $renderer->render($mod, $params);
		}

		self::$mods[$module] = ob_get_clean();

		return self::$mods[$module];
	}

	/**
	 * Loads and renders the module
	 *
	 * @param   string  $id  The id of the module
	 *
	 * @return  mixed
	 *
	 * @since   3.9.0
	 */
	protected function _loadid($id)
	{
		self::$modules[$id] = '';
		$document = JFactory::getDocument();
		$renderer = $document->loadRenderer('module');
		$modules  = JModuleHelper::getModuleById($id);
		$params   = array('style' => 'none');
		ob_start();

		if ($modules->id > 0)
		{
			echo $renderer->render($modules, $params);
		}

		self::$modules[$id] = ob_get_clean();

		return self::$modules[$id];
	}
}
PK�j&]�)��	.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�F�3jce/jce.phpnu�[���<?php

/**
 * @copyright   Copyright (C) 2015 Ryan Demmer. All rights reserved
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved
 * @license     GNU General Public License version 2 or later
 */
defined('JPATH_BASE') or die;

/**
 * JCE.
 *
 * @since       2.5.20
 */
class PlgContentJce extends JPlugin
{
    public function onContentPrepareForm($form, $data)
    {
        JFactory::getApplication()->triggerEvent('onPlgSystemJceContentPrepareForm', array($form, $data));
    }
}
PK�j&]�Ȭ��jce/jce.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="1.6" type="plugin" group="content" method="upgrade">
  <name>plg_content_jce</name>
  <version>2.9.38</version>
  <creationDate>27-06-2023</creationDate>
  <author>Ryan Demmer</author>
  <authorEmail>info@joomlacontenteditor.net</authorEmail>
  <authorUrl>http://www.joomlacontenteditor.net</authorUrl>
  <copyright>Copyright (C) 2006 - 2023 Ryan Demmer. All rights reserved</copyright>
  <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
  <description>PLG_CONTENT_JCE_XML_DESCRIPTION</description>
  <files folder="plugins/content/jce">
    <file plugin="jce">jce.php</file>
  </files>

  <languages folder="administrator/language/en-GB">
      <language tag="en-GB">en-GB.plg_content_jce.ini</language>
      <language tag="en-GB">en-GB.plg_content_jce.sys.ini</language>
  </languages>
</extension>
PK�j&]�)��
jce/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�<��jce/css/media.cssnu&1i�.field-media-wrapper .modal{height:90vh}.field-media-wrapper .modal .modal-body{max-height:100%!important}.field-media-wrapper .modal .modal-body iframe{height:calc(90vh - 120px)!important}PK�j&]�#o,,jce/css/index.htmlnu&1i�<html><body bgcolor="#FFFFFF"></body></html>PK�j&]�)��readlesstext/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]q��e�]�]"readlesstext/readlesstextthumb.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id$
 */

defined( '_JEXEC' ) or die;
jimport( 'joomla.plugin.plugin' );
jimport( 'joomla.utilities.date' );

class ReadLessTextThumb
{
  /**
   * Checks if the given url is still a valid thumbnail url.
   * Determines the correct url to the corresponding thumbnail.
   * If the thumbnail does not exist, it is created
   * @param string $url The url to the thumbnail image
   * @param dict $minimum Associative array as given to @c GetThumbnail().
   *   used to recreate the expected thumbnail url.
   * @param dict $crop Associative array as given to @c GetThumbnail().
   *   used to recreate the expected thumbnail url.
   * @param int $thumbWidth A number. May be zero or negative. When positive, it
   *   indicates the maximum width of the resized thumbnail. Else, there is no
   *   restriction on image width, and will be chosen in function of the
   *   height.
   *   OUT: If @c true is returned, this variable will contain the extact thumbnail width, in pixels.
   * @param int $thumbHeight A number. May be zero or negative. When positive, it
   *   indicates the maximum height of the resized thumbnail. Else, there is
   *   no restriction on image height, and will be chosen in function of the
   *   width.
   *   OUT: If @c true is returned, this variable will contain the exact thumbnail height, in pixels.
   * @return @c true if the given thumbnail url is still correct. @c false
   *   when some checks failed or could not be performed.
   * @see GetThumbnail
   */
  public static function ValidateThumbnail( $imageUrl, $thumbnailUrl, $minimum, $crop, & $thumbWidth, & $thumbHeight )
  {
    $success = false;

    $ext = strrchr( $thumbnailUrl, '.'); /* e.g.: .png */
    $expectedThumbnailPath = self::_DetermineThumbnailPath( $imageUrl, $minimum, $crop, $thumbWidth, $thumbHeight, $ext );
    $expectedThumbnailUrl = self::_DetermineUrlFromPath( $expectedThumbnailPath );

    if ( $thumbnailUrl == $expectedThumbnailUrl )
    {
      if ( @file_exists( $expectedThumbnailPath ) )
      {
        /* The given thumbnail exists, is located in the cache, and
         * the minimum configuration settings haven't been changed since.
         * we can re-use it.
         */
        $sizeArray = @getimagesize( $expectedThumbnailPath );
        $thumbWidth = $sizeArray[ 0 ];
        $thumbHeight = $sizeArray[ 1 ];

        $success = true;
      }
    }

    return $success;
  }

  private static function _DetermineImageType( $url )
  {
    $type = false;
    if ( function_exists( 'exif_imagetype' ) )
    {
      $type = @exif_imagetype( $url );
    }
    else if ( function_exists( 'getimagesize' ) )
    {
      $list = @getimagesize( $url );
      if ( $list )
      {
        $type = $list[2];
      }
    }

    if ( !/*NOT*/$type )
    {
      /* Fallback: try to determine the correct image type by checking for an extension in the url. */
      $ext = '';
      $parts = explode( '.', $url );
      if ( count( $parts ) > 1 )
      {
        $parts = explode( '?', $parts[ count( $parts ) - 1 ], 2 );
        $ext = JString::strtolower( $parts[ 0 ] );
      }
      if ( array_key_exists( $ext, ReadLessTextThumb::$_extToType ) )
      {
        $type = ReadLessTextThumb::$_extToType[ $ext ];
      }
    }

    return $type;
  }

  private static function _DetermineThumbnailPath( $imageUrl, $minimum, $crop, $thumbWidth, $thumbHeight, $ext )
  {
    $path = JPATH_CACHE . '/plg_readlesstext/';
    if ( !/*NOT*/@file_exists( $path ) )
    {
      @mkdir( $path );
    }

    if ( !/*NOT*/@is_dir( $path ) or !/*NOT*/@is_writable( $path ) )
    {
      /* Insufficient write permissions. Use fall-back. */
      $thumbnailUrl = $imageUrl;
    }
    else
    {
      $string = $imageUrl . $minimum[ 'width' ] . $minimum[ 'height' ] . $minimum[ 'ratio' ]
        . $crop[ 'horizontal_position' ] . $crop[ 'vertical_position' ]
        . $thumbWidth . $thumbHeight . 'v5.2 (r274)';
      $thumbnailPath = $path . md5( $string ) . $ext;
    }
    return $thumbnailPath;
  }

  private static function _DetermineUrlFromPath( $path )
  {
    $host = parse_url( $path, PHP_URL_HOST );
    if ( $host )
    {
      /* $path is already a url. */
      $url = false;
    }
    else if ( JString::strpos( $path, JPATH_BASE . '/' ) === 0 )
    {
      $url = JString::str_ireplace( JPATH_BASE . '/', JURI::base(), $path );
    }
    else
    {
      $url = JURI::base() . $path;
    }
    return $url;
  }

  private static function _DeterminePathFromUrl( $url )
  {
    $host = parse_url( $url, PHP_URL_HOST );
    if ( $host )
    {
      if ( JString::strpos( $url, JURI::base() . '/' ) === 0 )
      {
        $url = JString::str_ireplace( JURI::base(), JPATH_BASE . '/', $path );
      }
      else
      {
        $path = false; /* Can not be converted to a local path. */
      }
    }
    else
    {
      $path = JPATH_BASE . '/' . $url;
      $path = JString::str_ireplace( '//', '/', $path );
    }
    return $path;
  }

  /**
   * Find the resized dimensions, keeping the proportions.
   * @param uint $width
   * @param uint $height
   * @param uint $thumbWidth
   * @param uint $thumbHeight
   * @param dict $crop Associative array, with keys 'horizontal_position',
   *   'vertical_position' and values 'left', 'right', 'center' or 'no'.
   */
  private static function _DetermineResizeFactor( $width, $height, $thumbWidth, $thumbHeight, $crop )
  {
    /* There are four different ways to resize:
     * A: resize full width to thumbnail width,
     *     resize height with same ratio,
     *      crop height to thumbnail height (top, bottom, evenly both)
     * B: resize full height to thumbnail height,
     *     resize width with same ratio,
     *      crop width to thumbnail width (left, right, evenly both)
     * C: resize full width to thumbnail width,
     *     resize height with same ratio,
     *      resized height <= thumbnail height
     * D: resize full height to thumbnail height,
     *     resize width with same ratio,
     *      resized width <= thumbnail width
     *
     *  Based on
     * - the actual image dimensions: ix, iy
     * - the desired thumbnail dimensions: tx, ty
     *  - the crop options:
     *     crop horizontal: yes (left/right/evenly) or no (do not crop horizontally)
     *      crop vertical: yes (left/right/evenly) or no (do not crop vertically)
     * we need to determine the resize factor.
     *
     * Determine the horizontal and vertical ratio's: rx, ry
     * - If rx < ry: If resized using ry, the horizontal width will be
     *     greater than the thumbnail width. So either the width must
     *     be cropped (if allowed), either the image must be resized
     *     using rx (and thus the resized height will be less than the
     *     desired thumbnail height ty).
     * - If rx == ry: highly unlikely. Crop options are not needed here.
     *     Just resize using the single resize factor that was calculated.
     * - If rx > ry: Similar to the first case.
     *     Replace width <> height, rx <> ry and ty <> tx
     * Thus:
     * rx, ry = tx/ix, ty/iy
     * rx < ry
     *   ? crop horizontal ? r = ry : r = rx
     *   : crop vertical ? r = rx : r = ry
     */

    if ( $thumbWidth > 0 )
    {
      $resizeFactorWidth = min( 1, $thumbWidth / $width );
    }
    else
    {
      $thumbWidth = $width;
      $resizeFactorWidth = 1;
    }
    if ( $thumbHeight > 0 )
    {
      $resizeFactorHeight = min( 1, $thumbHeight / $height );
    }
    else
    {
      $thumbHeight = $height;
      $resizeFactorHeight = 1;
    }
    $resizeFactor = 1; /* Default value */
    if ( $resizeFactorWidth < $resizeFactorHeight )
    {
      /* Width is (relatively) greater than the height. */
      if ( in_array( $crop[ 'horizontal_position' ], array( 'left', 'right', 'center' ) ) )
      {
        /* Horizontal cropping is allowed. We may resize less,
         * and crop the extraneous part.
        */
        $resizeFactor = $resizeFactorHeight;
      }
      else
      {
        /* Horizontal cropping is not allowed. The full width must be
         * resized: the resized height will be less than the intended
        * thumbnail height.
        */
        $resizeFactor = $resizeFactorWidth;
      }
    }
    else
    {
      /* Vertical cropping is allowed. We may resize less,
       * and crop the extraneous part.
      */
      if ( in_array( $crop[ 'vertical_position' ], array( 'top', 'bottom', 'center' ) ) )
      {
        $resizeFactor = $resizeFactorWidth;
      }
      else
      {
        /* Vertical cropping is not allowed. The full height must be
         * resized: the resized width will be less than the intended
        * thumbnail width.
        */
        $resizeFactor = $resizeFactorHeight;
      }
    }
    return $resizeFactor;
  }

  /**
   * Determine the start positions sx, sy: everything lower and
   * everything higher than that plus the image width/height will be
   * thrown away (cropped).
   * @param uint $width
   * @param uint $height
   * @param uint $thumbWidth
   * @param uint $thumbHeight
   * @param dict $crop Associative array, with keys 'horizontal_position',
   *   'vertical_position' and values 'left', 'right', 'center' or 'no'.
   * @param unknown_type $resizeFactor
   */
  private static function _DetermineCroppedRectangle( $width, $height, & $thumbWidth, & $thumbHeight, $crop, $resizeFactor )
  {
    /*
     * Default value is 0, 0, to be used when cutting on the
     * right/bottom, or when cropping is disabled.
     *
     * If there is something to be thrown away, i.e.
     * if r * ix > tx
     *   cut left, retain right ? sx = ix - tx / r
     *   cut right, retain left ? sx = 0
     *   cut evenly ? sx = (ix - tx / r) / 2
     *
     * Likewise for sy
     */

    $horizontalStart = 0; /* Default value */
    $usedWidth = min( $width, $thumbWidth / $resizeFactor );
    $thumbWidth = intval( ( $usedWidth * $resizeFactor ) + 0.01 );
    if ( $usedWidth + 1 < $width )
    {
      switch ( $crop[ 'horizontal_position' ] )
      {
        case 'center':
          $horizontalStart = max( 0, ( $width - $usedWidth ) / 2 );
          break;

        case 'right':
          $horizontalStart = max( 0, $width - $usedWidth );
          break;

        case 'left':
          /* $horizontalStart remains 0 */
          break;

        default:
          /* Do not crop the width after all. We should never get here! */
          break;
      }
    }

    $verticalStart = 0; /* Default value */
    $usedHeight = min( $height, $thumbHeight / $resizeFactor );
    $thumbHeight = intval( ( $usedHeight * $resizeFactor ) + 0.01 );
    if ( $usedHeight + 1 < $height )
    {
      switch ( $crop[ 'vertical_position' ] )
      {
        case 'center':
          $verticalStart = max( 0, ( $height - $usedHeight ) / 2 );
          break;

        case 'bottom':
          $verticalStart = max( 0, $height - $usedHeight );
          break;

        case 'top':
          /* $verticalStart remains 0 */
          break;

        default:
          /* Do not crop the height after all. We should never get here! */
          break;
      }
    }

    return array( $horizontalStart, $verticalStart, $usedWidth, $usedHeight );
  }

  private static function _LoadImageUsingCurl( $url, $maxImageLoadTime )
  {
    $image = false;
    $curl = false;
    if ( function_exists( 'curl_init' ) )
    {
      $curl = curl_init();
    }
    if ( $curl )
    {
      curl_setopt( $curl, CURLOPT_URL, $url );
      curl_setopt( $curl, CURLOPT_HEADER, false );
      curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
      curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, $maxImageLoadTime );
      if ( ( ini_get( 'open_basedir' ) == '') and
          ( ( ini_get( 'safe_mode' ) == 'Off' ) or ( !/*NOT*/ini_get( 'safe_mode' ) ) ) )
      {
        /* The follow location option can not be activated when either dafe_mode or open_basedir
         * is set in php.ini - as a security measure. Trying to set it anyway results in a warning.
         * @todo If this is not set, redirection is not possible. A workaround for this is
         *   described here: http://stackoverflow.com/a/6918742/911550
         *   To implement?
         */
        curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
      }
      curl_setopt( $curl, CURLOPT_MAXREDIRS, 11/*just a number that seems plenty enough*/ );
      curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER,  FALSE );
      $contents = curl_exec( $curl );
      curl_close( $curl );
      $image = @imagecreatefromstring( $contents );
    }
    return $image;
  }

  /**
   * Tries various ways to open an image and read its contents.
   * @param string $url References a local image with relative or full path, or a remote image.
   * @param function $loadFunction
   * @return resource image upon success, false on failure.
   */
  private static function _LoadImage( $url, $loadFunction, $maxImageLoadTime )
  {
    $originalDefaultSocketTimeoutValue = false;

    /* Always first try the url as given.
     * If that fails, try to convert the url to a local absolute path.
     * If that can not be done, or loading fails again, try to convert to a full url.
     * Try loading both using imagecreatefrom.+, and using curl combined with imagecreatefromstring.
     * If that all fails, give up.
     */

    $fullPath = self::_DeterminePathFromUrl( $url );
    $fullUrl = self::_DetermineUrlFromPath( $url );

    $tries = array();
    $tries[] = 'curl';
    $tries[] = 'normal';
    if ( $fullPath )
    {
      $tries[] = 'fullPath';
    }
    /* Always include at least one way to fetch an image based on the full url. I had a report from a user who
     * apparently couldn't load images referenced locally, but could load images referenced via a url (???).
     */
    if ( $fullUrl and ini_get( 'allow_url_fopen' ) )
    {
      $tries[] = 'fullUrl';
      if ( $maxImageLoadTime > 0 )
      {
        $originalDefaultSocketTimeoutValue = ini_set( 'default_socket_timeout', $maxImageLoadTime );
      }
    }
    $tries[] = 'curl';

    $image = false;
    foreach ( $tries as $try )
    {
      if ( !/*NOT*/$image )
      {
        switch ( $try )
        {
          case 'normal':
            $image = @call_user_func( $loadFunction, $url );
            break;

          case 'fullPath':
            $image = @call_user_func( $loadFunction, $fullPath );
            break;

          case 'fullUrl':
            $image = @call_user_func( $loadFunction, $fullUrl );
            break;

          case 'curl':
            if ( $fullUrl )
            {
              $image = self::_LoadImageUsingCurl( $fullUrl, $maxImageLoadTime );
            }
            else
            {
              $image = self::_LoadImageUsingCurl( $url, $maxImageLoadTime );
            }
            break;

          default:
            /* May never come here. */
            break;
        }
      }
    }

    if ( $originalDefaultSocketTimeoutValue /* is FALSE when ini_set failed or was not executed */ )
    {
      ini_set( 'default_socket_timeout', $originalDefaultSocketTimeoutValue );
    }

    return $image;
  }

  /**
   * Determines the correct url to the corresponding thumbnail.
   * If the thumbnail does not exist, it is created
   * @param string $url The path to the image
   * @param dict $minimum Associative array, with keys 'width', 'height', 'ratio',
   *   and values 0 or positive numbers, expressed in pixels.
   *   Looked at both to find a previously created thumbnail; and when the
   *   thumbnail does not exist yet and has to be created.
   * @param dict $crop Associative array, with keys 'horizontal_position',
   *   'vertical_position' and values 'left', 'right', 'center' or 'no'.
   * @param int $thumbWidth A number. May be zero or negative. When positive, it
   *   indicates the maximum width of the resized thumbnail. Else, there is no
   *   restriction on image width, and will be chosen in function of the
   *   height.
   *   OUT: If the path to the thumbnail is returned, this variable will contain
   *   the extact thumbnail width, in pixels.
   * @param int $thumbHeight A number. May be zero or negative. When positive, it
   *   indicates the maximum height of the resized thumbnail. Else, there is
   *   no restriction on image height, and will be chosen in function of the
   *   width.
   *   OUT: If the path to the thumbnail is returned, this variable will contain
   *   the extact thumbnail height, in pixels.
   * @param int $lifetime The lifetime of the thumbnail in seconds to set when it
   *   is created by calling this function. Not used to check if the existing
   *   thumbnail is still valid. Default: 4 weeks (2419200 seconds).
   * @return false if an error occurred or if the given $url is incorrect. The
   *   path to the thumbnail otherwise.
   */
  public static function GetThumbnail( $url, $minimum, $crop, & $thumbWidth, & $thumbHeight, $lifetime = 2419200, $maxImageLoadTime = 60 )
  {
    $type = self::_DetermineImageType( $url );
    if ( $type and array_key_exists( $type, ReadLessTextThumb::$_image ) )
    {
      $ext = ReadLessTextThumb::$_image[ $type ][ 'ext' ];
      $thumbnailPath = self::_DetermineThumbnailPath( $url, $minimum, $crop, $thumbWidth, $thumbHeight, $ext );
      $thumbnailUrl = self::_DetermineUrlFromPath( $thumbnailPath );

      if ( @file_exists( $thumbnailPath ) )
      {
        /* Thumbnail already exists.
         * The image resource $url has been examined during a previous execution;
         * and according to the settings, it is fit to serve as a thumbnail.
         */
        $sizeArray = @getimagesize( $thumbnailPath );
        $thumbWidth = $sizeArray[ 0 ];
        $thumbHeight = $sizeArray[ 1 ];
      }
      else
      {
        $image = self::_LoadImage( $url, ReadLessTextThumb::$_image[ $type ][ 'load' ], $maxImageLoadTime );
        $width = -1;
        $height = -1;
        if ( $image )
        {
          $width = max( 1, @imagesx( $image ) ); /* Ensure a division is possible. */
          $height = max( 1, @imagesy( $image ) ); /* Ensure a division is possible. */
        }
        $ratio = min( $width / $height, $height / $width );
        if ( !/*NOT*/$image
                or ( $width < $minimum[ 'width' ] )
                or ( $height < $minimum[ 'height' ] )
                or ( $ratio < $minimum[ 'ratio' ] ) )
        {
          /* Thumbnail may not be created.
           * According to the settings, it is not fit to serve as a thumbnail.
          */
          $thumbnailUrl = false;
        }
        else
        {
          $resizeFactor = self::_DetermineResizeFactor( $width, $height, $thumbWidth, $thumbHeight, $crop );
          /* $thumbWidth and $thumbHeight is now updated as well. */

          /* The image width to use is equal to r * tx
           * The image height to use is equal to r * ty
           */

          $start = self::_DetermineCroppedRectangle( $width, $height, $thumbWidth, $thumbHeight, $crop, $resizeFactor );
          $horizontalStart = $start[0];
          $verticalStart = $start[1];
          $usedWidth = $start[2];
          $usedHeight = $start[3];
          /* $thumbWidth and $thumbHeight is now updated as well. */

          /* Create thumbnail */
          $thumbnail = call_user_func( ReadLessTextThumb::$_image[ $type ][ 'create' ], $thumbWidth, $thumbHeight );
          if ( $type == 1 /* IMAGETYPE_GIF */ )
          {
            /* Make the thumbnail initially transparent if the original was transparent too.
             * Otherwise, fill it initially up with all white.
             */
            $transparentColorIdentifier = @imagecolortransparent( $image );
            if ( $transparentColorIdentifier >= 0 )
            {
              $colors = @imagecolorsforindex( $image, $transparentColorIdentifier );
              $transcolorindex = @imagecolorallocate( $thumbnail, $colors[ 'red' ], $colors[ 'green' ], $colors[ 'blue' ] );
              @imagefill( $thumbnail, 0, 0, $transcolorindex );
              @imagecolortransparent( $thumbnail, $transcolorindex ); /* Needed? */
            }
            else
            {
              $whiteColorIdentifier = @imagecolorallocate( $thumbnail, 255, 255, 255 );
              @imagefill( $thumbnail, 0, 0, $whitecolorindex);
            }
          }

          if ( ReadLessTextThumb::$_image[ $type ][ 'create_alpha' ] )
          {
            call_user_func( ReadLessTextThumb::$_image[ $type ][ 'create_alpha' ], $thumbnail, false );
          }
          call_user_func( ReadLessTextThumb::$_image[ $type ][ 'copy' ], $thumbnail, $image,
              0, 0, $horizontalStart, $verticalStart,
              $thumbWidth, $thumbHeight, $usedWidth, $usedHeight );
          if ( ReadLessTextThumb::$_image[ $type ][ 'save_alpha' ] )
          {
            call_user_func( ReadLessTextThumb::$_image[ $type ][ 'save_alpha' ], $thumbnail, true );
          }
          call_user_func( ReadLessTextThumb::$_image[ $type ][ 'save' ], $thumbnail, $thumbnailPath );

          /* The expiration information is not used directly, but it is still
           * added to allow Joomla's core garbage collection functionality to work.
           */
          $expirePath = $thumbnailPath . '_expire';
          @file_put_contents( $expirePath, ( time() + $lifetime) );
        }
      }
    }
    else
    {
      /* To me, the remaining image types are esoteric. Some of them I never
       * even heard of.
       * OR
       * Determining the image type failed.
       */
      $thumbnailUrl = false;
    }

    return $thumbnailUrl;
  }

  private static $_extToType = array(
      'gif' => 1 /* IMAGETYPE_GIF */,
      'jpg' => 2 /* IMAGETYPE_JPEG */,
      'jpeg' => 2 /* IMAGETYPE_JPEG */,
      'png' => 3 /* IMAGETYPE_PNG */,
      'bmp' => 6 /* IMAGETYPE_PNG */
  );

  private static $_image = array(
      1 /* IMAGETYPE_GIF */ => array(
          'ext' => '.gif',
          'load' => 'imagecreatefromgif',
          'create' => 'imagecreate',
          'create_alpha' => '',
          'copy' => 'imagecopyresampled',
          'save_alpha' => '',
          'save' => 'imagegif'
      ),
      2 /* IMAGETYPE_JPEG */ => array(
          'ext' => '.jpg',
          'load' => 'imagecreatefromjpeg',
          'create' => 'imagecreatetruecolor',
          'create_alpha' => '',
          'copy' => 'imagecopyresampled',
          'save_alpha' => '',
          'save' => 'imagejpeg'
      ),
      3 /* IMAGETYPE_PNG */ => array(
          'ext' => '.png',
          'load' => 'imagecreatefrompng',
          'create' => 'imagecreatetruecolor',
          'create_alpha' => 'imagealphablending',
          'copy' => 'imagecopyresampled',
          'save_alpha' => 'imagesavealpha',
          'save' => 'imagepng'
      ),
      6000 /* IMAGETYPE_BMP */ => array(
          'ext' => '.bmp',
          'load' => 'imagecreatefromwbmp',
          'create' => 'imagecreate',
          'create_alpha' => '',
          'copy' => 'imagecopyresampled',
          'save_alpha' => '',
          'save' => 'imagewbmp'
      ) );
}
?>
PK�j&]Jp!��m�m#readlesstext/readlesstexthelper.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id$
 */

defined( '_JEXEC' ) or die;
jimport( 'joomla.plugin.plugin' );
jimport( 'joomla.utilities.date' );

class ReadLessTextHelper
{
  /**
   * Checks whether it is allowed to run.
   * This function does not make any modification, except when in discover
   * mode: @c $article->text will then be set to the discover information.
   * @param JTableContent $article the item fetched from the database
   * @param params $params the parameters to use
   * @param dict $options OUT the key 'discover' with a boolean value will be
   *   filled in.
   * @param bool $activeByDefaultOnAllContentItems True if all content items
   *   must be shortened by 'read less', unless explicitly disallowed.
   * @param string $pluginName When Discover mode is active, this string
   *   will be added to the discover information.
   * @param string $extraDiscoverInfo When Discover mode is active, this string
   *   will be added to the discover information.
   * @return Boolean value
   */
  public static function Filter( &$callCount, $article, $params, &$options,
      $activeByDefaultOnAllContentItems = false, $pluginName, $extraDiscoverInfo = '' )
  {
    $app = JFactory::getApplication();

    $current = array();
    $current[ 'component' ] = JRequest::getWord( 'option' );
    $current[ 'scope' ] = $app->scope;
    $current[ 'view' ] = JRequest::getWord( 'view' );
    $current[ 'viewId' ] = JRequest::getInt( 'id' );
    $current[ 'layout' ] = JRequest::getWord( 'layout' );
    $current[ 'articleId' ] = self::GetArticleId( $article );
    $current[ 'articleSlug' ] = self::GetArticleSlug( $article );
    $current[ 'articleCategoryId' ] = self::GetCategoryId( $article );

    $articleNumberSkipCount = max( 0, $params->get( 'articleNumberSkipCount' ) );
    $articleNumberShortenCount = max( 0, $params->get( 'articleNumberShortenCount' ) );

    $discoverTextAboutScopeType = '';
    $discoverTextAboutCallCount = '';
    $lastMatchingContext = false;
    $contexts = array(); /* Used to contain all contexts that match the item for this code is executed. */
    $contextDescriptions = array(); /* Only used to facilitate Discover mode. */
    $possiblyInterchangeable = array(); /* Only used to facilitate Discover mode. */

    $scope = array( 'com_' => $params->get( 'componentScope' ), 'mod_' => $params->get( 'moduleScope' ) );
    $key = JString::substr( $current[ 'scope' ], 0, 4 /* com_ or mod_ */ );
    if ( !/*NOT*/key_exists( $key, $scope ) )
    {
      $scope[ $key ] = 'never';
    }

    switch ( $scope[ $key ] )
    {
      case 'always':
        $discoverTextAboutScopeType .= "<br/>This plugin must always be active on <tt>" . $current[ 'scope' ] . "</tt>.";
        $allowed = true;
        break;

      case 'never':
        $discoverTextAboutScopeType .= "<br/>This plugin may never be active on <tt>" . $current[ 'scope' ] . "</tt>.";
        $allowed = false;
        break;

      case 'accordingToContexts':
      default:
        $allowed = self::_CheckCallCount( $callCount, $articleNumberSkipCount, $articleNumberShortenCount, $discoverTextAboutCallCount );
        $callCount++;

        if ( $allowed )
        {
          if ( $params->get( 'when', '0' ) == '0' )
          {
            /* common usage */

            if ( $activeByDefaultOnAllContentItems )
            {
              $allowedFilters = 'com_content';
              $disallowedFilters = '';
            }
            else
            {
              $allowedFilters = 'com_content:blog, com_content:categories, com_content:category, com_content:featured, com_content:frontpage, com_content:section';
              $disallowedFilters = '';
            }
          }
          else
          {
            /* specific usage */
            $allowedFilters = $params->get( 'allowed', '' );
            $disallowedFilters = $params->get( 'disallowed', '' );
          }

          if ( $activeByDefaultOnAllContentItems and ( $current[ 'component' ] == 'com_content' ) )
          {
            $allowedFilters = 'com_content, ' . $allowedFilters;
          }

          $contexts = self::_GetContexts( $current, $contextDescriptions, $possiblyInterchangeable );
          $allowed = self::_CheckContexts( $contexts, $allowedFilters, $disallowedFilters, $lastMatchingContext );
        }
        break;
    }

    /* An extra performance penalty is present in Joomla 2.5.5+
     * Since that version, all articles on a page are processed by content plugins,
     * even when it is known their content is not going to be visible.
     * See http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&tracker_item_id=28591
     * Examples are the list of article titles at the bottom of an article category blog,
     * or an article list page.
     * For read less text (again), these articles can better be skipped immediately.
     * Both view and layout are checked to see if one of these two situations occur.
     * It is also limited for component articles of com_content, as I'm uncertain whether other components
     * behave the same. Better the (for most people small) performance penalty than a faulty behavior.
     * * Thank you for this, gabs087. *
     */
    if ( ( $key == 'com_' ) and ( $current[ 'component' ] == 'com_content' ) )
    {
      if ( ( $current[ 'view' ] == 'category' ) and ( $current[ 'layout' ] != 'blog' ) )
      {
        /* Don't process articles in category lists. */
        $allowed = false;
      }
      if ( ( $current[ 'view' ] == 'featured' ) or ( $current[ 'layout' ] == 'blog' ) )
      {
        $maxVisibleArticleCount = $article->params->get( 'num_leading_articles', 0 )
            + $article->params->get( 'num_intro_articles', 0 );
        if ( ( $maxVisibleArticleCount > 0 ) and ( $callCount > $maxVisibleArticleCount ) )
        {
          /* Don't process articles on blog pages whose content will not be part of the page. */
          $allowed = false;
        }
      }
    }

    $discover = $params->get( 'discover', false );
    if ( $discover )
    {
      $version = new JVersion();
      $discover = JFactory::getUser()->authorise( 'core.login.admin' );
    }
    if ( $options !== NULL )
    {
      /* Store this value so that the same logic in this function doen't need to be performed later on. */
      $options[ 'discover' ] = $discover;
    }
    if ( $discover )
    {
      $article->text = self::_GetDiscoverText( $pluginName, $allowed, $current, $contexts, $contextDescriptions,
          $possiblyInterchangeable, $lastMatchingContext, $discoverTextAboutScopeType, $discoverTextAboutCallCount,
          $extraDiscoverInfo );
      $article->introtext = $article->text;
      $article->fulltext = "";
    }

    return $allowed;
  }

  private static function _CheckContexts( $contexts, $allowedFilters, $disallowedFilters, &$lastMatchingContext )
  {
    $allowed = true;

    /* Loop over key (may be active if filter does not match) value (parameter name) pairs */
    $loop = array( false => $allowedFilters, true => $disallowedFilters);
    foreach ( $loop as $defaultAllowed => $filters )
    {
      if ( $filters )
      {
        /* A bit more manipulation is required here: $filters can be given in
         * different formats
         * @li {component}:{view}:id targets a specific article displayed in all the views of the given type.
         * @li {component}:{view}=nr:id targets a specific article displayed in the given view only.
         * @li {component}:id targets a specific article displayed in any view.
         * @li {component}:{view} targets all articles displayed in all the views of the given type.
         * @li {component}:{view}=nr targets all articles displayed in the given view .
         * @li {component} targets all articles of that component.
         * @note If {component}: is not given, com_content: is assumed.
         * @note If {view} is not given, it is not checked for.
         * Plus contexts may be given on different lines.
         * The string manipulations below ensure that all filters start with a component name
         * followed by a view (with or without nr) and/or an id.
         */
        $filters = ',' . JString::strtolower( $filters );
        $filters = preg_replace( '/[\r\n]+/', ',', $filters );
        $search = array(  ' ', ',',  '+com_', '+all', '+' );
        $replace = array( '',  ',+', 'com_',  'all',  'com_content:' );
        /*                  A    BB    CCCCC    DDDD    EEEEEEEEEEE
         * A: remove all whitespaces
         * B: append a + (a character that can not occur in a correct context) after each ,
         * C: remove all + if it was already followed by a component name
         * D: remove all + if it was already followed by the special keyword all
         * E: all remaining + chars indicate the absence of a component name. Fill in the default
         */
        $filters = JString::str_ireplace( $search, $replace, $filters );
        $filterList = explode( ',', $filters );

        $filterAllows = $defaultAllowed;
        foreach ( $contexts as $c )
        {
          if ( in_array( $c, $filterList ) !== FALSE )
          {
            $filterAllows = !/*NOT*/$defaultAllowed;
            $lastMatchingContext = $c;
            break;
          }
        }
        $allowed &= $filterAllows;
      }
      else
      {
        /* There is no restriction set. Retain the default or already determined value for $allowed. */
      }
    }

    return $allowed;
  }

  private static function _GetContexts( $current, &$contextDescriptions, &$possiblyInterchangeable )
  {
    $contexts = array();

    /* Category/section/other descriptions have to be explicitly enabled.
     * Do not include the more general compact indications of the current
     * page/article in that case.
     */
    if ( $current[ 'articleId' ] != 0 )
    {
      $contexts[] = $current[ 'component' ];
      $contextDescriptions[] = 'all pages of this component';

      $contexts[] = $current[ 'component' ] . ':' . $current[ 'view' ];
      $contextDescriptions[] = 'all similar pages';

      if ( $current[ 'viewId' ] )
      {
        $contexts[] = $current[ 'component' ] . ':' . $current[ 'view' ] . '=' . $current[ 'viewId' ];
        $contextDescriptions[] = 'all items on this page only';
        $possiblyInterchangeable[] = $contexts[ count( $contexts ) - 1 ];
      }
    }
    $contexts[] = $current[ 'component' ] . ':' . $current[ 'articleId' ];
    $contextDescriptions[] = 'this item only on all pages';

    $contexts[] = $current[ 'component' ] . ':' . 'all-in-' . $current[ 'articleCategoryId' ];
    $contextDescriptions[] = 'all items from category ' . $current[ 'articleCategoryId' ] . ' on all pages';
    $contexts[] = $current[ 'component' ] . ':' . $current[ 'view' ] . ':' . $current[ 'articleId' ];
    $contextDescriptions[] = 'this item only on all similar pages';
    $contexts[] = $current[ 'component' ] . ':' . $current[ 'view' ] . ':' . 'all-in-' . $current[ 'articleCategoryId' ];
    $contextDescriptions[] = 'all items from category ' . $current[ 'articleCategoryId' ] . ' on all similar pages';
    $possiblyInterchangeable[] = $contexts[ count( $contexts ) - 1 ];
    if ( $current[ 'viewId' ] )
    {
      $contexts[] = $current[ 'component' ] . ':' . $current[ 'view' ] . '=' . $current[ 'viewId' ] . ':' . $current[ 'articleId' ];
      $contextDescriptions[] = 'this item only on this page only';
      $contexts[] = $current[ 'component' ] . ':' . $current[ 'view' ] . '=' . $current[ 'viewId' ] . ':' . 'all-in-' . $current[ 'articleCategoryId' ];
      $contextDescriptions[] = 'all items from category ' . $current[ 'articleCategoryId' ] . ' on this page only';
      $possiblyInterchangeable[] = $contexts[ count( $contexts ) - 1 ];
    }

    return $contexts;
  }

  private static function _CheckCallCount( $callCount, $articleNumberSkipCount, $articleNumberShortenCount, &$discoverTextAboutCallCount )
  {
    $allowed = false;

    if ( $callCount < $articleNumberSkipCount )
    {
      $discoverTextAboutCallCount .= "<br/>This plugin may only become active on this page after skipping "
          . $articleNumberSkipCount . " article(s) or item(s) on this page (still "
          . ( $articleNumberSkipCount - $callCount ) . " to skip).";
    }
    else if ( ( $articleNumberShortenCount == 0 )
        or ( $callCount < $articleNumberSkipCount + $articleNumberShortenCount ) )
    {
      $allowed = true;
    }
    else
    {
      $discoverTextAboutCallCount .= "<br/>This plugin may only become active on this page for "
          . $articleNumberShortenCount . " articles or items on this page.";
    }

    return $allowed;
  }

  private static function _GetDiscoverText( $pluginName, $allowed, $current, $contexts, $contextDescriptions,
      $possiblyInterchangeable, $lastMatchingContext, $discoverTextAboutScopeType, $discoverTextAboutCallCount,
      $extraDiscoverInfo )
  {
    $enableOrDisable = array( true => "disable", false => "enable" );
    $activeOrNot = array( true => "<strong>active</strong>", false => "<strong>not active</strong>" );

    $text = "<p>";
    $text .= "<tt>" . $pluginName . "</tt> is " . $activeOrNot[ $allowed ] . " on this item ";
    if ( $allowed )
    {
      $text .= "(provided the contents' length is large enough).";
    }
    $text .= "</dt><dd>";
    $text .= "&nbsp;&nbsp;" . $discoverTextAboutScopeType . "<br>";
    $text .= "&nbsp;&nbsp;" . $discoverTextAboutCallCount . "<br>";
    $text .= "</p>";

    $text .= "<dl><dt><strong>Information</strong> you can use to create your own contexts:</dt><dd>";
    $text .= "&nbsp;&nbsp;component: <tt>" . $current[ 'component' ] . "</tt></br>";
    $text .= "&nbsp;&nbsp;scope: <tt>" . $current[ 'scope' ] . "</tt></br>";
    $text .= "&nbsp;&nbsp;layout: <tt>" . $current[ 'layout' ] . "</tt></br>";
    $text .= "&nbsp;&nbsp;view: <tt>" . $current[ 'view' ] . "</tt></br>";
    $text .= "&nbsp;&nbsp;view id: <tt>" . $current[ 'viewId' ] . "</tt></br>";
    $text .= "&nbsp;&nbsp;item id: <tt>" . $current[ 'articleId' ] . "</tt></br>";
    $text .= "&nbsp;&nbsp;category id of item: <tt>" . $current[ 'articleCategoryId' ] . "</tt>";
    $text .= "</dd></dl>";

    if ( $lastMatchingContext )
    {
      /* Maybe active, maybe not, but at least one context matched. */
      $text .= "<strong>The last context you configured that matched the current item is <tt>" . $lastMatchingContext . "</tt></strong>";
      if ( !/*NOT*/$allowed )
      {
        $text .= "<br/>If you want to enable the plugin on this item on this page, you minimally need to remove or change this context.";
      }
    }
    else if ( $allowed )
    {
      /* Active, but no context ever matched. */
      $text .= "<br/>There are no contexts listed where <tt>" . $pluginName . "</tt> is allowed to be active, so it is <strong>active by default</strong>.";
    }
    else
    {
      if ( count( $contexts ) == 0 )
      {
        /* Not active, and no contexts have been reseaRched. Do not print anything about contexts. */
      }
      else
      {
        /* Not active, but no context ever matched. */
        $text .= "<br/>No context matches the current item, so it is <strong>not active by default</strong>.";
      }
    }
    $text .= "</p>";
    if ( count( $contexts ) == 0 )
    {
      /* Not active, and no contexts have been reserached. Do not print anything about contexts. */
    }
    else
    {
      $text .= "<dl><dt><strong>Contexts matching this article</strong>: to " . $enableOrDisable[ $allowed ] . " <tt>" . $pluginName . "</tt> on</dt><dd>";
      for ( $i = 0; $i < count( $contexts ); $i++)
      {
        $text .= "&nbsp;&nbsp;" . $contextDescriptions[$i] . ", use <tt>" . $contexts[$i] . "</tt><br/>";
      }
      $text .= "</dd></dl>";
    }

    $text .= "<p>";
    if ( $current[ 'articleId' ] == $current[ 'viewId' ] )
    {
    $text .= "<strong>Note</strong>: if the view name <tt>"
        . $current[ 'view' ]
        . "</tt> serves to display a single item/article, the contexts <tt>"
        . implode( '</tt>, <tt>n', $possiblyInterchangeable )
        . "</tt> may yield the same result and are interchangeable.<br/>";
    }
    $text .= "<strong>Note</strong>: this discover information is only displayed to users with back-end permissions and can be disabled in the back-end.<br/>";
    if ( count( $contexts ) == 0 )
    {
      /* Not active, and no contexts have been researched. Do not print anything about contexts. */
    }
    else
    {
      $text .= "<dl><dt><strong>General</strong>: all contexts follow this syntax: <tt>component:view:item</tt></dt><dd>";
          $text .= "&nbsp;&nbsp;if the <tt>ncomponent</tt> is left out, <tt>com_content:</tt> is assumed;<br/>";
          $text .= "&nbsp;&nbsp;if the <tt>nview</tt> is left out, <tt>all</tt> views match;<br/>";
          $text .= "&nbsp;&nbsp;if the <tt>item</tt> is left out, <tt>all</tt> items match.<br/>";
          $text .= "</dd></dl>";
    }
    if ( $extraDiscoverInfo )
    {
      $text .= "<br/>";
      $text .= "<strong>" . $extraDiscoverInfo . "</strong>";
    }
    $text .= "</p>";

    return $text;
  }

  public static function Trim( $str )
  {
    return preg_replace( "/(^\s+)|(\s+$)/us", "", $string );
  }

  public static function Rtrim( $string )
  {
    return preg_replace( "/\s+$/us", "", $string );
  }

  /**
   * Determines if @c $string ends with $lastPart.
   * @param string $string The string to examine
   * @param string $lastPart The substring to find at the end of @c $string
   * @return true if @c $string ends with @c $lastPart, false otherwise
   */
  private static function _EndsWith( $string, $lastPart )
  {
    if ( strlen( $string ) < strlen( $lastPart ) )
    {
      $endsWith = false;
    }
    else
    {
      if ( substr_compare( $string, $lastPart, -1 * strlen( $lastPart ) ) )
      {
        $endsWith = false;
      }
      else
      {
        $endsWith = true;
      }
    }
    return $endsWith;
  }

  /**
   * Determines the length of the given article text.
   * @param string $htmltext The html text to consider.
   * @param string $lengthUnit Unit of the length to determine. One of 'char',
   *   'word', 'sentence', 'paragraph'.
   * @param bool $end OUT If true, the last part of @c htmlText ends the
   *   ongoing length unit.
   * @return the length expressed in the given unit.
   * @pre it is assumed subsequent whitespace has already been removed.
   */
  public static function DetermineLength( $htmltext, $lengthUnit, &$end )
  {
    switch ( $lengthUnit )
    {
      case 'sentence':
        /* Calculation is done using a list of sentences.
         * Exclude empty sentences, exclude sentences with only markup,
         * exclude consecutive punctuation characters.
         * The text is also trimmed to determine afterwards whether the last
         * sentence has ended.
         * Paragraph, row and list item demarcations also mark the end of a sentence.
         *
         * Ensure that all sentence endings can be treated alike.
         */
        $search = array( '</p>', '</li>', '</dt>', '</dl>', '</tr>', '#', '.', '?', '!', '¿' );
        $replace = array( '.', '.', '.', '.', '.', '_', '#', '#', '#', '#' );
        $htmltext = JString::str_ireplace( $search, $replace, $htmltext );
        $text = rtrim( strip_tags( $htmltext ) );
        $length = 0;
        foreach ( explode( '#', $text ) as $sentence )
        {
          if ( preg_split( '/\s+/', $sentence, 1, PREG_SPLIT_NO_EMPTY ) )
          {
            $length++;
          }
        }
        $end = self::_EndsWith( $text, '#' );
        break;

      case 'paragraph':
        /* Calculation is done using a list of non-empty paragraphs.
         * Exclude empty paragraphs, exclude paragraps with only markup.
         * The text is trimmed first to determine whether the last paragraph
         * has ended afterwards.
         * Table and list demarcations also mark the end of a sentence.
         * Ensure that all paragraph endings can be treated alike.
         */
        $search = array( '</ul>', '</ol>', '</dl>' );
        $replace = array( '</p>', '</p>', '</p>' );
        $htmltext = JString::str_ireplace( $search, $replace, $htmltext );
        $htmltext = rtrim( $htmltext );
        $length = 0;
        foreach ( explode( '</p>', $htmltext ) as $paragraph )
        {
          $paragraph = strip_tags( $paragraph );
          if ( preg_split( '/\s+/', $paragraph, 1, PREG_SPLIT_NO_EMPTY ) )
          {
            $length++;
          }
        }
        $end = self::_EndsWith( $htmltext, '</p>' );
        break;

      case 'word':
        /* Paragraph, row and list item demarcations also mark the end of a word.
         * Ensure that all word endings can be treated alike.
         */
        $search = array( '</p>', '</li>', '</dt>', '</dl>', '</tr>', '.', '?', '!', '¿' );
        $replace = array( ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' );
        $htmltext = JString::str_ireplace( $search, $replace, $htmltext );

        /* Calculation only needs the plaintext. */
        $text = strip_tags( $htmltext );

        $length = count( preg_split( '/\s+/', $text, -1, PREG_SPLIT_NO_EMPTY ) );
        $end = self::_EndsWith( $text, ' ' );
        break;

      case 'char':
      default:
        /* Calculation only needs the plaintext. */
        $text = strip_tags( $htmltext );

        /* Subsequent whitespace must be counted as one when $lengthUnit equals 'char' */
        $text = preg_replace( '/\s+/mis', ' ', $text );

        $length = JString::strlen( $text );
        $end = true;
        break;
    }

    return $length;
  }

  /**
   * Returns the id of the article this plugin is being called upon.
   * Works for com_content and com_eventlist items,
   * and others (list?)
   * @param JTableContent $article IN The item/article being prepared for display.
   * @return A number.
   */
  public static function GetArticleId( $article )
  {
    $id = 0;
    foreach ( array( 'id', 'did', 'cid' ) as $field )
    {
      if ( isset( $article->$field ) )
      {
        $id = (int)$article->$field;
        break;
      }
    }

    return $id;
  }

  /**
   * Returns the slug of the article this plugin is being called upon.
   * Works for com_content and com_eventlist items,
   * and others (list?)
   * @param JTableContent $article IN The item/article being prepared for display.
   * @return A string.
   */
  public static function GetArticleSlug( $article )
  {
    $id = self::GetArticleId( $article );

    if ( isset( $article->slug ) and $article->slug )
    {
      $slug = $article->slug;
    }
    else if ( isset( $article->alias ) and $article->alias )
    {
      $slug = $id . ':' . $article->alias;
    }
    else
    {
      if ( isset( $article->title ) and $article->title )
      {
        $slug = $id . ':' . JApplication::stringURLSafe( $article->title );
      }
      else if ( isset( $article->name ) and $article->name )
      {
        $slug = $id . ':' . JApplication::stringURLSafe( $article->name );
      }
      else
      {
        $slug = $id;
      }
    }

    return $slug;
  }

  /**
   * Returns the id of the category of the article this plugin is being called
   * upon.
   * Works for com_content and com_eventlist items,
   * and others (list?)
   * @param JTableContent $article The item/article being prepared for display.
   * @return A number.
   */
  public static function GetCategoryId( &$article )
  {
    $id = 0;
    foreach ( array( 'catid', 'catsid' ) as $field )
    {
      if ( isset( $article->$field ) )
      {
        $id = (int)$article->$field;
        break;
      }
    }
    return $id;
  }

  /**
   * Returns the slug of the category of the article this plugin is being called
   * upon.
   * Works for com_content and com_eventlist items,
   * and others (list?)
   * @param JTableContent $article The item/article being prepared for display.
   * @return A string.
   */
  public static function GetCategorySlug( &$article )
  {
    $id = self::GetCategoryId( $article );

    if ( isset( $article->catslug ) and $article->catslug )
    {
      $slug = $article->catslug;
    }
    else if ( isset( $article->category_alias ) and $article->category_alias )
    {
      $slug = $id . ':' . $article->category_alias;
    }
    else
    {
      $slug = $id;
    }

    return $slug;
  }

  /**
   *
   * @param string $plainText
   * @param integer $length
   * @param string $lengthUnit Unit of the length. One of 'char',
   *   'word', 'sentence', 'paragraph'.
   * @param bool $retainWholeWords Only used when $lengthUnit equals 'char'
   */
  public static function Substr( $plainText, $length, $lengthUnit, $retainWholeWords = false )
  {
    $substr = $plainText;
    switch ( $lengthUnit )
    {
      case 'sentence':
        $substrByteLength = 0;
        $matches = preg_split( '/([.?!¿]+)/mis', $plainText, $length + 1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE );

        /* Retain $length sentences and the line ending of each sentence. */
        $i = min( count( $matches ), $length * 2 );
        $substrByteLength = $matches[ $i ][1]; /* Start position of first match not to retain. */

        $substr = substr( $plainText, 0, $substrByteLength);
        break;

      case 'paragraph':
        /* Default value is correct. Nothing to do. */
        break;

      case 'word':
        $words = preg_split( '/\s+/mis', $plainText, $length + 1, PREG_SPLIT_NO_EMPTY );
        $words = array_slice( $words, 0, $length );
        $substr = implode( ' ', $words );
        break;

      case 'char':
      default:
        $words = preg_split( '/(\s+)/mis', $plainText, $length + 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
        $i = 0;
        while ( $i < count( $words ) )
        {
          if ( ctype_space( $words[ $i ] ) )
          {
            $wordLength = 1; /* Count whitespace separating the words as one char. */
          }
          else
          {
            $wordLength = JString::strlen( $words[ $i ] );
          }

          if ( $length >= $wordLength )
          {
            $length -= $wordLength;
            $i++;
          }
          else
          {
            break;
          }
        }

        $lastChars = '';
        if ( ( $length > 0 ) and ( $i < count( $words ) ) )
        {
          if ( $retainWholeWords )
          {
            /* The $i-th word is to be cut in half.
             * Retain the whole word if it is the first to retain,
             * Toss it completely away otherwise.
             */
            $i = max( 1, $i );
          }
          else
          {
             $lastChars = JString::substr( $words[ $i ], 0, $length );
          }
        }

        /* $i represents the number of words to retain fully,
         * $lastChars contains a few characters of the last word that is retained only partially.
         */
        $words = array_slice( $words, 0, $i );
        $words[] = $lastChars;
        $substr = implode( ' ', $words );
        break;
    }

    return $substr;
  }
}
?>
PK�j&]Q�=�� � readlesstext/script.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id$
 */

defined( '_JEXEC' ) or die;

class plgContentReadlesstextInstallerScript
{
  /**
   * Constructor
   * @param JAdapterInstance $adapter The object responsible for running this script1
   */
  public function __constructor(JAdapterInstance $adapter)
  {
    //void
  }

  /**
   * Called before any type of action
   * @param string $route Which action is happening (install|uninstall|discover_install)
   * @param JAdapterInstance $adapter The object responsible for running this script
   * @return boolean True on success
   */
  public function preflight($route, JAdapterInstance $adapter)
  {
    return true;
  }

  /**
   * Called after any type of action
   * @param string $route Which action is happening (install|uninstall|discover_install)
   * @param JAdapterInstance $adapter The object responsible for running this script
   * @return boolean True on success
   */
  public function postflight($route, JAdapterInstance $adapter)
  {
    echo "
        <h2>v5.2 (r274)</h2>
        <dl>
        <dt><em>read less text</em> will control the article text:</dt>
        <dd>preview size, formatting and image placement can be adjusted to your liking, precisely on those pages and
          for those articles or items you want. <em>read less text</em> will not alter your article table in any way.
          Only the display is controlled: uninstalling or disabling will bring back the original text.</dd>
        <dt>Take your time</dt>
        <dd>to read all the helpful tooltips and fully configure
          <a href='index.php?option=com_plugins&view=plugins&filter_search=read'><em>read less text</em></a>
          to your liking. Use the discover mode if you need extreme flexibility in controlling which articles get
          shortened - and when.</dd>
        <dt>This version does not affect the article&acute;s titles.</dt>
        <dd>If you want to control the title length, prepend or append specific information, and adjust the casing of
          the title, you can install and use the separate extension
          <a href='http://extensions.joomla.org/extensions/style-a-design/titles/16619/'><em>read less title.</em></a>
          </dd>
        </dl>

        <h2>Important notes affecting your configuration:</h2>
        <dl>

        <dt><strong>Since v5.2</strong></dt>
        <dd><em>Experimental</em> support has been added for some image gallery plugins. When gallery plugins
          are used in an article, some text that looks like<code>{gallery}path/to/images{/gallery}</code> is inserted.
          You can instruct <em>read less text</em> to scan that referenced location for images as well.<br/>
          The list of content gallery plugins that is recognized is: <tt>SIGE</tt>, <tt>sigplus</tt>,
          <tt>VSIG (Very Simple Image gallery)</tt>, <tt>pPGallery</tt>, <tt>CSS Gallery</tt><br/>
          There are also quite some limitations:
          <ul>
            <li>Can not link to the gallery with a word, used at the article</li>
            <li>Can not load image information from a file.</li>
            <li>The option 'root' is not supported (sigplus)</li>
            <li>Picasaweb albums are not supported</li>
            <li>Paths with spaces are not supported.</li>
            </ul>
          </dd>

        <dt><strong>Since v5.1</strong></dt>
        <dd>The option <code>Show Intro Text</code> as set in the
          <a href='index.php?option=com_content'>Article Manager</a> &gt; <code>Options</code> &gt;
          <code>Show Intro Text</code> &gt; <code>Articles</code> can now be used to determine whether the full article
          or only the intro text may be considered for shortening.
          <br />See also the tooltip that comes with the option
          <code>Length</code> &gt; <code>Respect Position Existing Read More</code>.
          <br/><strong>You may want to check that setting</strong>.</dd>

        <dt><strong>Since v5.1</strong></dt>
        <dd>The field that replaces the default 'Read more' value - in the <em>Read More (Suffix)</em> section - has
          been split in two.
          The first field is added at the end of the text, before the paragraph is closed;
          the other field is added at the end of article, after all HTML tags (including the paragraph tag
          <code>p</code>) have been closed.
          <br/><strong>You may want to (re-)configure these fields</strong>.</dd>

        <dt><strong>Since v5.0</strong></dt>
        <dd><em>read less text</em> provides two <code>Date Format</code> fields, used while replacing tokens in the
          prefix and suffix fields. The way these date formats must be constructed has been changed. You can review
          <a href='http://php.net/manual/en/function.date.php'>the manual for the function date</a>
          for a list of formatting characters and their explanation, and for a list of examples.
          <br/><strong>You may want to review these fields, or clear them to load the new, correct, default value.
          </strong>
        </dd>

        </dl>";
    return true;
  }

  /**
   * Called on installation
   * @param JAdapterInstance $adapter The object responsible for running this script
   * @return boolean True on success
   */
  public function install(JAdapterInstance $adapter)
  {
    $this->_CreateTable();
    return true;
  }

  /**
   * Called on update
   * @param JAdapterInstance $adapter The object responsible for running this script
   * @return boolean True on success
   */
  public function update(JAdapterInstance $adapter)
  {
    $this->_CreateTable();
    return true;
  }

  /**
   * Called on uninstallation
   * @param JAdapterInstance $adapter The object responsible for running this script
   */
  public function uninstall(JAdapterInstance $adapter)
  {
    $this->_DestroyTable();
    return true;
  }

  private function _CreateTable()
  {
    $db = JFactory::getDBO();
    $db->setQuery( self::_createTableSql );
    $db->query();
  }

  private function _DestroyTable()
  {
    $db = JFactory::getDBO();
    $db->setQuery( self::_destroyTableSql );
    $db->query();
  }

  const _createTableSql = "CREATE TABLE IF NOT EXISTS `#__readlesstext` (
    `id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `rtable` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'The component name where the item resides in. Also called option',
    `rid` INT(10) NOT NULL COMMENT 'The unique id of the item in that component. e.g. the article id for com_content',
    `hash` VARCHAR(255) DEFAULT '' COMMENT 'The fingerprint of the full item text.',
    `char` INTEGER UNSIGNED DEFAULT 0 COMMENT 'Count in the full item text.',
    `word` INTEGER UNSIGNED DEFAULT 0 COMMENT 'Count in the full item text.',
    `sentence` INTEGER UNSIGNED DEFAULT 0 COMMENT 'Count in the full item text.',
    `paragraph` INTEGER UNSIGNED DEFAULT 0 COMMENT 'Count in the full item text.',
    `image_tag_start_pos` INTEGER UNSIGNED DEFAULT 0 COMMENT 'Start position of the image tag where the thumbnail was created from.',
    `image_tag_length` INTEGER UNSIGNED DEFAULT 0 COMMENT 'Length of the image tag in nr of UTF8 chars.',
    `image_url` VARCHAR(1023) NOT NULL DEFAULT '' COMMENT 'Url to the image where the thumbnail was created from.',
    `thumbnail_url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Url to the thumbnail.',
    `last_update` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Debug information.',
    UNIQUE (`rtable`, `rid`) ) DEFAULT CHARSET=utf8;";

  const _destroyTableSql = "DROP TABLE IF EXISTS `#__readlesstext`";
}

?>
PK�j&]b%J�^�^�!readlesstext/readlesstextmain.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id$
 */

defined( '_JEXEC' ) or die;
require_once 'readlesstextcache.php';
require_once 'readlesstextexpand.php';
require_once 'readlesstexthelper.php';
require_once 'readlesstextthumb.php';

if ( !/*NOT*/ class_exists( 'ContentHelperRoute' ) )
{
  /* There have been some reports of people that somehow got errors by having
   * this class not being included by default (not only with this plugin; also
   * with other completely unrelated plugins.
   * Although this block should never be entered, it serves as a workaround
   * for those people having this issue.
   */
  require_once( JPATH_SITE . '/components/com_content/helpers/route.php' );
}

class ReadLessTextMain extends JPlugin
{
  /**
   * Constructor
   * @param object &$subject The object to observe
   * @param array $config An optional associative array of configuration settings.
   */
  public function __construct( &$subject, $config = array() )
  {
    parent::__construct( $subject, $config );
  }

  /**
   * Main entry function. The configuration parameters set in the constructor are used to fully exert read less text's
   * functionality.
   * @param JTableContent $article The item/article being prepared for display.
   * @param number $callCount The number of times this function has been
   *   called by the same plugin. This value is used to determine whether
   *   the given article may be shortened.
   *   Will have been incremented by one when this function returns.
   * @param string $pluginName
   */
  public function ReadLessText( &$article, &$callCount, $pluginName = 'plg_content_readlesstext', $cacheTable = '#__readlesstext' )
  {
//    jimport( 'joomla.error.profiler' );
//    $this->profiler = new JProfiler();
//    $this->profiles = array();
//    $this->profiles[] = $this->profiler->mark( ' IN ' . $article->id );

    JPlugin::loadLanguage( $pluginName );

    /* The two blocks below are a workaround for issues in the Joomla core.
     * - In a 'featured' view, the fulltext is not set or empty, even when it
     *   is present in the database
     * - In a single article view, the readmore property is not set.
     * Seen in 1.6.6, 1.7.2 & 2.5.4
     *
     * It also ensures that when this plugin is invoked on other components (e.g. com_media),
     * There are no php notices.
     */
    foreach ( array( 'fulltext', 'readmore' ) as $var )
    {
      if ( !/*NOT*/ isset( $article->$var ) )
      {
        $article->$var = '';
      }
    }
    if ( isset( $article->id ) and $article->readmore and ( !/*NOT*/ $article->fulltext ) )
    {
      $db = JFactory::getDBO();
      $query = "SELECT c.fulltext
          FROM #__content c
          WHERE c.id = " . $article->id;
      $db->setQuery( $query );
      $article->fulltext = $db->loadResult();
    }

    $this->_isShortened = false;
    $this->_prefix = '';
    $this->_suffix = '';

    $alwaysActiveForGuests = $this->params->get( 'alwaysActiveForGuests', '0' );
    if ( $alwaysActiveForGuests )
    {
      $extraDiscoverInfo = 'Guests can only see the shortened article, unless a context in the <em>Disallowed</em> field matches this item.';
      $activeByDefaultOnAllContentItems = ( JFactory::getUser()->guest == 1 );
    }
    else
    {
      $extraDiscoverInfo = '';
      $activeByDefaultOnAllContentItems = false;
    }

//    $this->profiles[] = $this->profiler->mark( ' before filter ' );
    $options = array();
    if ( ReadLessTextHelper::Filter( $callCount, $article, $this->params, $options,
        $activeByDefaultOnAllContentItems, $pluginName, $extraDiscoverInfo ) )
    {
      /* Entering this block means: read less text must be active. */
//      $this->profiles[] = $this->profiler->mark( ' after filter ' );

      if ( $options[ 'discover' ] )
      {
        /* Discover mode is active: the article's text has been replaced with
         * discover information and may not be altered.
         * No need to update the private variables - they will not be used.
         */
      }
      else
      {
//        $this->profiles[] = $this->profiler->mark( ' before prepare ' );
        $length = $this->_PrepareArticleText( $article, $this->params, $cacheTable );
//        $this->profiles[] = $this->profiler->mark( ' after prepare ' );

        $imageHtml = '';
        $prefix = '';
        $shortened = $article->text;
        $inlineSuffix = '';
        $closingTags = '';
        $suffix = '';

        $expand = new ReadLessTextExpand();
        $expand->SetExpandables( $article, $this->_plaintext, Null, Null );
        $this->_GetParams( $article, $length, $expand );

        if ( ( $this->_applyFormatting == 'when_active' )
            or ( ( $this->_applyFormatting == 'when_long_enough' ) and $length ) )
        {
//          $this->profiles[] = $this->profiler->mark( ' before strip ' );
          $article->text = $this->_StripTokens( $article->text );
//          $this->profiles[] = $this->profiler->mark( ' after strip ' );

//          $this->profiles[] = $this->profiler->mark( ' before cutoff ' );
           $a = $this->_CutOff( $article->text, $length );
           $shortened = $a[0];
           $closingTags = $a[1];
//          $this->profiles[] = $this->profiler->mark( ' after cutoff ' );
        }

        if ( ( $this->_createThumbnail == 'when_active' )
            or ( ( $this->_createThumbnail == 'when_shortened' ) and $this->_isShortened ) )
        {
//          $this->profiles[] = $this->profiler->mark( ' before thumbnail ' );
          $imageHtml = $this->_GetThumbnailHtml( $article );
//          $this->profiles[] = $this->profiler->mark( ' after thumbnail ' );
        }

        if ( ( $this->_addPrefix == 'when_active' )
            or ( ( $this->_addPrefix == 'when_shortened' ) and $this->_isShortened ) )
        {
          $prefix = $this->_prefix;
        }
        if ( ( $this->_addInlineSuffix == 'when_active' )
            or ( ( $this->_addInlineSuffix == 'when_shortened' ) and $this->_isShortened ) )
        {
          $inlineSuffix = $this->_inlineSuffix;
        }
        if ( ( $this->_addSuffix == 'when_active' )
            or ( ( $this->_addSuffix == 'when_shortened' ) and $this->_isShortened ) )
        {
          $suffix = $this->_suffix;
        }

        if ( $this->_cache )
        {
          $this->_cache->Store();
        }

        $article->text = $this->_wrapperTag[ 'open' ] . $imageHtml . $prefix
            . $shortened
            . $inlineSuffix . $closingTags . $suffix . $this->_wrapperTag[ 'close' ];
      }

      $article->introtext = $article->text;
      $article->fulltext = '';

//       $this->profiles[] = $this->profiler->mark( ' OUT ' . $article->id );
//       $article->text .= '<div>';
//       foreach ( $this->profiles as $profile )
//       {
//         $article->text .= "<br/>" . $profile;
//       }
//       $article->text .= '<br/></div>';
//       $article->introtext = $article->text;
//       $article->fulltext = '';
    }
  }

  /**
   * Determines the html version of the intro and the full field,
   * irrespective the component.
   * @param JTableContent $article The item/article being prepared for display.
   * @return An array, with the first element containing the intro text,
   *   if any, and the second element the remainder of the text.
   */
  private static function _DetermineArticleText( $article )
  {
    /* Be extra careful, so that other components do not give PHP notices
     * and warnings.
     * - Some components do not have the introtext and/or the fulltext field
     *   but only the text field,
     *   e.g. ??
     * - Others have none of the three, but use a special name (why o why),
     *   e.g. in com_eventlist:
     *     datdescription for an event.
     *     catdescription for a category.
     *     locdescription for a venue.
     *     description for a group.
     * - whereas others have all three of them, and full info is to be
     *   fetched from introtext and fulltext.
     */
    $introtext = '';
    $fulltext = '';
    if ( isset( $article->introtext ) )
    {
      $introtext = $article->introtext;
    }
    if ( isset( $article->fulltext ) )
    {
      $fulltext = $article->fulltext;
    }
    if ( !/*NOT*/ $introtext and !/*NOT*/ $fulltext)
    {
      if ( isset( $article->text ) and $article->text )
      {
        $fulltext = $article->text;
      }
    }
    if ( !/*NOT*/ $introtext and !/*NOT*/ $fulltext)
    {
      /* No text has been found yet. Check if it is stored in a variable named
       * xxxdescription, like eventlist does.
       */
      $values = array();
      foreach ( get_object_vars( $article ) as $key => $value )
      {
        if ( strstr( $key, 'description') !== false )
        {
          $values[] = $value;
        }
      }
      /* Only accept the text from a xxxdescription when it is the only one
       * found: e.g. eventlist uses one object to store the text of both
       * the event and the venue, and it is impossible to choose the correct
       * one.
       */
      if ( count( $values ) == 1 )
      {
        $fulltext = $values[0];
      }
    }

    $readmoreStartPos = JString::strpos( $introtext, '<p class="readmore">' );
    if ( $readmoreStartPos !== false )
    {
      /* Another plugin has already tampered with this article, and somehow a readmore token got included.
       * e.g. NoNumber's ArticleAnywhere can cause this.
       * Consider only the part before that token as the intro text.
       */
      $introtext = JString::substr_replace( $introtext, '', $readmoreStartPos );
    }

    return array( $introtext, $fulltext );
  }

  /**
   * Determines the length of @c $this->_htmltext in the given unit.
   * The length is fetched from the cache. If it is not available in the cache, it is calculated and then added to the
   * cache - but not yet committed in the cache, use @c Store() for that.
   * @param string $lengthUnit One of 'char', 'word', 'sentence', 'paragraph'
   * @return int the requested length, in number of @c lengthUnit's
   */
  private function _DetermineLength( $string, $lengthUnit )
  {
    $length = $this->_cache->Get( $lengthUnit );
    if ( !/*NOT*/ $length )
    {
      $end = true; /* Just to define it; it is used as output parameter in the next call, but ignored by us. */
      $length = ReadLessTextHelper::DetermineLength( $this->_htmltext, $lengthUnit, $end );
      if ( $length )
      {
        $this->_cache->Set( $lengthUnit, $length );
      }
    }
    return $length;
  }

  /**
   * Determines the correct text to operate on. Sets the private variables plaintext and htmltext.
   * @param JTableContent $article IN OUT. The item/article being prepared for display. The properties introtext, text,
   *   fulltext and readmore will have been set or adapted.
   * @param params $params the parameters to use
   * @return mixed boolean false to indicate article may not be shortened, or a number indicating the nr of units to
   *   retain. It is still possible this number is greater than the entire article text length.
   * @post @c $article->text contains the text to be shortened or to display.
   * @note Even when @c false is returned, @c $article->text may have been changed - a manually inserted read more
   *   request is then overridden.
   */
  private function _PrepareArticleText( &$article, $params, $cacheTable )
  {
    $a = self::_DetermineArticleText( $article );
    $introtext = $a[0];
    $fulltext = $a[1];
    $plainintrotext = strip_tags( $introtext );
    $plainfulltext = strip_tags( $fulltext );
    $this->_plaintext = $plainintrotext . ' ' . $plainfulltext;
    $this->_htmltext = $introtext . ' ' . $fulltext;

    /* It is tempting to execute the line below, but this yields wrong results.
     * There are Russian (e.g. Р 0xd0 0xa0) and Greek (e.g. Π 0xce 0xa0) multi-byte characters
     * that are stripped from the 0xa0 byte, giving a rubbish character.
     * $this->_htmltext will - after further adaptation - eventually be output,
     * so all characters must at all times remain intact.
     * - btw, at the very least, the u modifier should be used. See e.g. ReadLessTextHelper::Rtrim()
     */
    //$this->_htmltext = preg_replace( '/\s+/muis', ' ', $this->_htmltext )

    $this->_cache = new ReadLessTextCache( $cacheTable, JRequest::getWord( 'option' ), $article->id,
        'v5.2 (r274)' . md5( $this->_htmltext ) );

    $this->_wordCount = $this->_DetermineLength( $this->_htmltext, 'word' );
    $this->_lengthUnit = $params->get( 'lengthUnit', 'char' );

    /* True when a 'read more' link has been explicitly inserted, and fulltext is not empty.
     * - the full text is made by combining introtext, (closing the paragraph), a
     *   hr tag (id 'system-readmore') (opening the paragraph) and fulltext.
     */
    $readmoreMarkerPresent = ( $fulltext and isset( $article->readmore ) and $article->readmore );
    if ( $readmoreMarkerPresent and ( $this->_respectExistingReadmoreLink == 'respectShowIntro' ) )
    {
      /* Shorten the article's intro text. */
      $article->text = $introtext;
      $cutOffLength = $params->get( 'cutOffTextLength', 1 );
    }
    else if ( $readmoreMarkerPresent and $this->_respectExistingReadmoreLink ) /* 1 / true */
    {
      /* Use the article's full intro text; do not try to shorten it. This is
       * accomplished by requesting to cut off at a ridiculously high value.
       */
      $article->text = $introtext;
      $this->_isShortened = true;
      $cutOffLength = PHP_INT_MAX;
    }
    else /* No read more present, or 0 / false */
    {
      $minimumLength = $params->get( 'minimumTextLength', 1 );
      $cutOffLength = $params->get( 'cutOffTextLength', 1 );
      $length = $this->_DetermineLength( $this->_htmltext, $this->_lengthUnit );
      if ( $length < $minimumLength )
      {
        $cutOffLength = false;
      }
      else if ( $length <= $cutOffLength )
      {
        $cutOffLength = false;
      }
      else
      {
        /* Shorten the article's full text. */
        $article->text = $this->_htmltext;
      }
    }

    $article->readmore = 0; /* We do not want Joomla to insert his own 'read more' token */
    if ( !/*NOT*/ $cutOffLength )
    {
      /* The article may not be shortened. Ensure the full article is present,
       * even when a manual to-be-ignored read more is present.
       */
      $article->text = $this->_htmltext;
    }

    $this->_wrapperTag = array( 'open' => '', 'close' => '' );
    $wrapperTag = $params->get( 'wrapperTag', '' );
    if ( $wrapperTag )
    {
      $wrapperClass = $params->get( 'wrapperClass', '' );
      if ( $wrapperClass )
      {
        $this->_wrapperTag[ 'open' ] = '<' . $wrapperTag . ' class="' . $wrapperClass . '">';
      }
      else
      {
        $this->_wrapperTag[ 'open' ] = '<' . $wrapperTag . '>';
      }

      $this->_wrapperTag[ 'close' ] = '</' . $wrapperTag . '>';
    }

    return $cutOffLength;
  }

  /**
   * Determines various options, which are stored in the private variables.
   * @note Not all private variables will be set. Those are covered in the @c _PrepareArticleText function
   * @param JTableContent $article RO. The item/article being prepared for display.
   * @params mixed $length Boolean false or a positive number. Indicates whether it is already determined if the article
   *   is to be shortened and how long the shortened article must become.
   * @param class $expand Instance of ReadLessTextExpand.
   * @pre _PrepareArticleText() must have been called beforehand: e.g. @c _plaintext is used (while expanding).
   */
  private function _GetParams( &$article, $length, $expand )
  {
    $this->_applyFormatting = $this->params->get( 'applyFormatting', 'when_active' );
    $this->_addPrefix = $this->params->get( 'addPrefix', 'when_active' );
    $this->_addInlineSuffix = $this->params->get( 'addInlineSuffix', 'when_active' );
    if ( $this->_addInlineSuffix == 'when_active_use_article_manager_option' )
    {
      if ( JComponentHelper::getParams( 'com_content' )->get( 'show_readmore' ) )
      {
        $this->_addInlineSuffix = 'when_active';
      }
      else
      {
        $this->_addInlineSuffix = 'no';
      }
    }
    $this->_addSuffix = $this->params->get( 'addSuffix', 'when_active' );
    if ( $this->_addSuffix == 'when_active_use_article_manager_option' )
    {
      if ( JComponentHelper::getParams( 'com_content' )->get( 'show_readmore' ) )
      {
        $this->_addSuffix = 'when_active';
      }
      else
     {
        $this->_addSuffix = 'no';
      }
    }
    $this->_respectExistingReadmoreLink = $this->params->get( 'respectExistingReadmoreLink', true );
    if ( $this->_respectExistingReadmoreLink == 'respectShowIntro')
    {
      if ( JComponentHelper::getParams( 'com_content' )->get( 'show_intro' ) )
      {
        $this->_respectExistingReadmoreLink = false;
      }
      else
      {
        /* The user does _not_ want to resepect an existing 'read more' token,
         * and likes to have the intro text separated from the full text after it.
         * Only shorten the intro text
         */
        $this->_respectExistingReadmoreLink = 'shortenIntroOnly';
      }
    }

    /* An array of tags or tokens which are used later on. */
    if ( ( $this->_applyFormatting == 'when_active' )
        or ( ( $this->_applyFormatting == 'when_long_enough' ) and $length ) )
    {
      $list = array(
          'extraSelfClosingTags',
          'tagsToRemove',
          'tagsToRemoveWithContents',
          'squareTokensToRemove',
          'curlyTokensToRemove',
          'squareTokensToRemoveWithContents',
          'curlyTokensToRemoveWithContents' );
    }
    else
    {
      $list = array(
          'extraSelfClosingTags');
    }
    foreach ( $list as $parameter )
    {
      $string = JString::strtolower( $this->params->get( $parameter, '' ) );
      $string = JString::str_ireplace( ' ', '', $string );
      if ( $string )
      {
        $parameter = '_' . $parameter;
        $this->$parameter = explode( ',', $string );
      }
    }

    $this->_articleUrl = JRoute::_( ContentHelperRoute::getArticleRoute(
        ReadLessTextHelper::GetArticleSlug( $article ), ReadLessTextHelper::GetCategorySlug( $article ) ) );
    $expand->SetExpandables( Null, Null, Null, array( '{url}' => $this->_articleUrl, '{words}' => $this->_wordCount ) );

    /* prefix */
    $translateAdditions = $this->params->get( 'translateAdditions', false );
    $prefixLinksToFullArticle = false;
    if ( JFactory::getUser()->guest == 0 )
    {
      $this->_prefix = $this->params->get( 'userPrefix', '' );
      $prefixLinksToFullArticle = $this->params->get( 'userPrefixLinksToFullArticle', true );
    }
    else
    {
      $this->_prefix = $this->params->get( 'guestPrefix', '' );
      $prefixLinksToFullArticle = $this->params->get( 'guestPrefixLinksToFullArticle', true);
    }
    if ( $translateAdditions )
    {
      $this->_prefix = JText::_( $this->_prefix );
    }
    $expand->SetExpandables( Null, Null, $this->params->get( 'prefixDateFormat', '%m/%d' ), null );
    $this->_prefix = $expand->expand( $this->_prefix );
    if ( $prefixLinksToFullArticle and $this->_prefix )
    {
      $this->_prefix = '<a href="' . $this->_articleUrl . '">' . $this->_prefix . '</a>';
    }

    /* inline suffix */
    $inlineSuffixLinksToFullArticle = false;
    if ( JFactory::getUser()->guest == 0 )
    {
      $this->_inlineSuffix = $this->params->get( 'userInlineSuffix', '' );
      $inlineSuffixLinksToFullArticle = $this->params->get( 'userInlineSuffixLinksToFullArticle', true );
    }
    else
    {
      $this->_inlineSuffix = $this->params->get( 'guestInlineSuffix', '' );
      $inlineSuffixLinksToFullArticle = $this->params->get( 'guestInlineSuffixLinksToFullArticle', true );
    }
    if ( $translateAdditions )
    {
      $this->_inlineSuffix = JText::_( $this->_inlineSuffix );
    }
    $expand->SetExpandables( Null, Null, $this->params->get( 'suffixDateFormat', '%m/%d' ), null );
    $this->_inlineSuffix = $expand->expand( $this->_inlineSuffix );
    if ( $inlineSuffixLinksToFullArticle and $this->_inlineSuffix )
    {
      $this->_inlineSuffix = '<a href="' . $this->_articleUrl . '">' . $this->_inlineSuffix . '</a>';
    }

    /* suffix */
    $suffixLinksToFullArticle = false;
    if ( JFactory::getUser()->guest == 0 )
    {
      $this->_suffix = $this->params->get( 'userSuffix', '' );
      $suffixLinksToFullArticle = $this->params->get( 'userSuffixLinksToFullArticle', true );
    }
    else
    {
      $this->_suffix = $this->params->get( 'guestSuffix', '' );
      $suffixLinksToFullArticle = $this->params->get( 'guestSuffixLinksToFullArticle', true );
    }
    if ( $translateAdditions )
    {
      $this->_suffix = JText::_( $this->_suffix );
    }
    $expand->SetExpandables( Null, Null, $this->params->get( 'suffixDateFormat', '%m/%d' ), null );
    $this->_suffix = $expand->expand( $this->_suffix );
    if ( $suffixLinksToFullArticle and $this->_suffix )
    {
      $this->_suffix = '<a href="' . $this->_articleUrl . '">' . $this->_suffix . '</a>';
    }

    /* Use the title or one of the -fixes as thumbnail tooltip. */
    switch ( $this->params->get( 'thumbnailTitle', 'articleTitle' ) )
    {
      case '0':
        $this->_thumbnailTitle = '';

      case 'prefix':
        $this->_thumbnailTitle = $this->_prefix;
        break;

      case 'suffix':
        $this->_thumbnailTitle = $this->_suffix;
        break;

      case 'inlineSuffix':
        $this->_thumbnailTitle = $this->_inlineSuffix;
        break;

      case 'articleTitle':
      default:
        $this->_thumbnailTitle = $article->title;
        break;
    }
    $this->_thumbnailTitle = strip_tags( $this->_thumbnailTitle );

    $this->_createThumbnail = $this->params->get( 'createThumbnail', 'when_active' );
    $this->_linkThumbnail = $this->params->get( 'linkThumbnail', true );
    $this->_defaultThumbnail = $this->params->get( 'defaultThumbnailTemplate', '' );
    $this->_defaultThumbnail = $expand->expand( $this->_defaultThumbnail );

    $this->_retainWholeWords = $this->params->get( 'retainWholeWords', false );

    $this->_crop[ 'horizontal_position' ] = $this->params->get( 'cropHorizontalPosition', 'no' );
    $this->_crop[ 'vertical_position' ] = $this->params->get( 'cropVerticalPosition', 'no' );

    $this->_cacheTime = $this->params->get( 'thumbCacheTime', 2419200 /* 4 weeks */ );
    $this->_maxImageLoadTime = $this->params->get( 'maxImageLoadTime', 0 );
    if ( $this->_maxImageLoadTime <= 0 )
    {
      $this->_maxImageLoadTime = 9999; /* Ridicously high: clamped below. */
    }
    $this->_maxImageLoadTime = max( 1, min( 11 /* seconds */, $this->_maxImageLoadTime ) );
    $this->_thumbWidth = $this->params->get( 'thumbWidth', 0 );
    $this->_thumbHeight = $this->params->get( 'thumbHeight', 0 );
    $this->_minimum[ 'width' ] = $this->params->get( 'minimumImageWidth', 0 );
    $this->_minimum[ 'height' ] = $this->params->get( 'minimumImageHeight', 0 );
    $this->_minimum[ 'ratio' ] = max( 0.05, min( 0.95, $this->params->get( 'minimumImageRatio', 0 ) ) );
  }

  /**
   * Searches for an image that passes all constraints set in the configuration settings; removes that image from the
   * article's text - if present - and returns HTML code containing a thumbnail to that image, readily suitable for
   * display.
   * @param JTableContent $article IN OUT. The item/article being prepared for display.
   * @param string $articleText IN, OUT. $article->text may have been adapted when this function returns.
   * @return String. The HTML code for displaying the styled, resized and linked first image according to the
   *   configuration settings, the empty string otherwise.
   */
  private function _GetThumbnailHtml( $article )
  {
    /* - First try to get all data from the cached information. If this succeeds, we can avoid using regular expressions.
     * - Else, try to find one in the full unshortened article.
     * - Else, try to find one in a possibly referenced gallery.
     * - Else, try to find a default thumbnail.
     */
    $thumbnailUrl = $this->_GetCachedThumbnail( $article->text );
    if ( !/*NOT*/ $thumbnailUrl )
    {
      $thumbnailUrl = $this->_PopImage( $this->_htmltext );
      if ( !/*NOT*/ $thumbnailUrl )
      {
        $thumbnailUrl = $this->_PopGalleryImage( $this->_htmltext );
        if ( !/*NOT*/ $thumbnailUrl )
        {
          $thumbnailUrl = $this->_GetDefaultThumbnail();
        }
      }
    }

    if ( $thumbnailUrl )
    {
      $attributes = $this->_GetImageAttributes( $this->_thumbnailTitle, $this->_thumbWidth, $this->_thumbHeight );
      if ( $this->_linkThumbnail )
      {
        $thumbnailHtml = '<a href="' . $this->_articleUrl . '"><img src="' . $thumbnailUrl. '"' . $attributes . '/></a>';
      }
      else
      {
        $thumbnailHtml = '<img src="' . $thumbnailUrl. '"' . $attributes . '/>';
      }
    }
    else
    {
      $thumbnailHtml = false;
    }

    return $thumbnailHtml;
  }

  /**
   * Fetches all cached image information. If the cached information is valid, it is used to construct the HTML code
   * containing a thumbnail, readily suitable for display. The image used to create the thumbnail, if present in the
   * article, will be stripped from the article's text.
   * @param string $articleText OUT. the string to adapt.
   * @return String. The HTML code for displaying the styled, resized and
   *   linked image according to the configuration settings, the empty
   *   string otherwise.
   */
  private function _GetCachedThumbnail( &$articleText )
  {
    $isValid = false;
    if ( $this->_cache )
    {
      $imageTagStartPos = $this->_cache->Get( 'image_tag_start_pos' );
      $imageTagLength = $this->_cache->Get( 'image_tag_length' );
      $imageUrl = $this->_cache->Get( 'image_url' );
      $thumbnailUrl = $this->_cache->Get( 'thumbnail_url' );

      if ( $thumbnailUrl )
      {
        $isValid = ReadLessTextThumb::ValidateThumbnail( $imageUrl, $thumbnailUrl, $this->_minimum, $this->_crop,
            $this->_thumbWidth, $this->_thumbHeight );
      }
    }

    if ( $isValid )
    {
      /* Check if the thumbnail was derived from an image referenced in the article text
       * i.e., check if it is not a default thumbnail.
       */
      if ( ( $imageTagStartPos >= 0 ) and ( $imageTagLength > 0 ) )
      {
        /* Remove the code for the image on the old location.
         * Don't do this blindly: it can be (it is likely, as I think it is a often used option)
         * that all images already have been removed from the given text.
         */
        if ( ( JString::substr( $articleText, $imageTagStartPos, 1 ) == '<' )
            and ( JString::substr( $articleText, $imageTagStartPos + $imageTagLength, 1 ) == '>' ) )
        {
          $imageUrlStartPos = strpos( $articleText, $imageUrl );
          if ( ( $imageTagStartPos < $imageUrlStartPos )
              and ( $imageUrlStartPos < $imageTagStartPos + $imageTagLength ) )
          {
            /* Ok, the portion we want to strip down does contain the url, and
             * does start and end with an opening resp. closing tag.
             * That's all we do to ascertain we will remove the correct portion.
             */
            $articleText = JString::substr_replace( $articleText, '', $imageTagStartPos, $imageTagLength );
          }
        }
      }
    }
    else
    {
      $thumbnailUrl = false;
    }

    return $thumbnailUrl;
  }

  /**
   * Searches for an image according to the default thumbnail template, and
   * returns HTML code containing a thumbnail to that image, readily
   * suitable for display.
   * @return String. The HTML code for displaying the styled, resized and
   *   linked image according to the configuration settings, the empty
   *   string otherwise.
   */
  private function _GetDefaultThumbnail()
  {
    if ( $this->_defaultThumbnail )
    {
      /* Be more lenient with respect to the default thumbnail: ensure it does not get rejected due to size and
       * dimension constraints.
       * The minimum contraints are not used any more after this (so no need to restore them afterwards).
       */
      $minimum[ 'width' ] = 0;
      $minimum[ 'height' ] = 0;
      $minimum[ 'ratio' ] = 0;
      $thumbnailUrl = ReadLessTextThumb::GetThumbnail( $this->_defaultThumbnail, $minimum, $this->_crop,
          $this->_thumbWidth, $this->_thumbHeight, $this->_cacheTime );

      if ( $thumbnailUrl )
      {
        $this->_cache->Set( 'image_tag_start_pos', -1 );
        $this->_cache->Set( 'image_tag_length', 0 );
        $this->_cache->Set( 'image_url', $this->_defaultThumbnail );
        $this->_cache->Set( 'thumbnail_url', $thumbnailUrl );
      }
    }
    else
    {
      $thumbnailUrl = false;
    }
    return $thumbnailUrl;
  }

  /**
   * Searches for an image in the article's text which is big enough according
   * to the configuration settings; removes that image from the article's
   * text, and returns HTML code containing a thumbnail to that image, readily
   * suitable for display.
   * @param string $articleText IN, OUT. the string to search in and to adapt.
   * @return String. The HTML code for displaying the styled, resized and
   *   linked first image according to the configuration settings, the empty
   *   string otherwise.
   * @note When an image is found, the results will have been cached when this function returns.
   */
  private function _PopImage( &$articleText )
  {
    $thumbnailUrl = false;
    $matchCount = preg_match( self::_imgPattern, $articleText, $matches, PREG_OFFSET_CAPTURE, 0 );
    while ( $matchCount )
    {
      $imageCode = $matches[0][0];
      $imageUrl = $matches[1][0];

      /* No acceptable image has been found yet, try this one. */
      $thumbnailUrl = ReadLessTextThumb::GetThumbnail( $imageUrl, $this->_minimum, $this->_crop, $this->_thumbWidth,
          $this->_thumbHeight, $this->_cacheTime, $this->_maxImageLoadTime );
      if ( $thumbnailUrl )
      {
        $imageTagStartPos = JString::strpos( $articleText, $imageCode );
        $imageTagLength = JString::strlen( $imageCode );

        /* Remove the code for the image on the old location. */
        $articleText = JString::substr_replace( $articleText, '', $imageTagStartPos, $imageTagLength );

        $this->_cache->Set( 'image_tag_start_pos', $imageTagStartPos );
        $this->_cache->Set( 'image_tag_length', $imageTagLength );
        $this->_cache->Set( 'image_url', $imageUrl );
        $this->_cache->Set( 'thumbnail_url', $thumbnailUrl );

        $matchCount = false; /* end the loop */
      }
      else
      {
        /* Prepare the next iteration
         * - The value of $offset determines where the next search starts.
         */
        $offset = $matches[ count( $matches ) - 1 ][1] + 1;
        $matchCount = preg_match( self::_imgPattern, $articleText, $matches, PREG_OFFSET_CAPTURE, $offset );
      }
    }

    return $thumbnailUrl;
  }

  /**
   * Searches for a tag which indicates a content gallery plugin is running. If one is found, it will search through the
   * content gallery for a suitable image (i.e. an image that satisfies the configuration constraints), and returns HTML
   * code containing a thumbnail to that image, readily suitable for display.
   * @param string $articleText IN, OUT. the string to search in and to adapt.
   * @return String. The HTML code for displaying the styled, resized and linked first image according to the
   *   configuration settings, the empty string otherwise.
   * @note When an image is found, the results will have been cached when this function returns.
   */
  private function _PopGalleryImage( &$articleText )
  {
    $thumbnailUrl = false;
    $matchCount = preg_match( self::_galleryPattern, $articleText, $matches, PREG_OFFSET_CAPTURE, 0 );
    while ( $matchCount )
    {
      $galleryCode = $matches[0][0];
      $galleryPath = $matches[2][0];

      /* No acceptable image has been found yet, try this one. */
      if ( $directoryContents = @dir( JPATH_SITE . '/images/' . $galleryPath ) )
      {
        while ( !/*NOT*/ $thumbnailUrl and $imagePath = $directoryContents->read() )
        {
          $imagePath = JPATH_SITE . '/images/' . $imagePath;
          $thumbnailUrl = ReadLessTextThumb::GetThumbnail( $imagePath, $this->_minimum, $this->_crop,
              $this->_thumbWidth, $this->_thumbHeight, $this->_cacheTime, $this->_maxImageLoadTime );
        }
        $directoryContents->close();
      }

      if ( $thumbnailUrl )
      {
        $imageTagStartPos = JString::strpos( $articleText, $galleryCode );
        $imageTagLength = JString::strlen( $galleryCode );

        /* Remove the code for the image on the old location. */
        $articleText = JString::substr_replace( $articleText, '', $imageTagStartPos, $imageTagLength );

        $this->_cache->Set( 'image_tag_start_pos', $imageTagStartPos );
        $this->_cache->Set( 'image_tag_length', $imageTagLength );
        $this->_cache->Set( 'image_url', $imagePath );
        $this->_cache->Set( 'thumbnail_url', $thumbnailUrl );

        $matchCount = false; /* end the loop */
      }
      else
      {
        /* Prepare the next iteration
         * - The value of $offset determines where the next search starts.
        */
        $offset = $matches[ count( $matches ) - 1 ][1] + 1;
        $matchCount = preg_match( self::_imgPattern, $articleText, $matches, PREG_OFFSET_CAPTURE, $offset );
      }
    }

    return $thumbnailUrl;
  }

  /**
   * Composes the attributes for the moved image, inclusive the inline CSS
   * attribute @c style.
   * This function does not make any modification.
   * @param alt: A string. The alternative text to be used for the image. Is also used as image title
   * @param $width: A Number. The size of the image in pixels. If 0 or negative, this value is not set.
   * @param $height: A Number. The size of the image in pixels. If 0 or negative, this value is not set.
   * @return string: Either the empty string when no attributes are needed;
   *   either a string ready for insertion as an attribute in a HTML tag.
   * @note Double quotes are used to quote the value.
   */
  private function _GetImageAttributes( $alt, $width = 0, $height = 0 )
  {
    $attributes = '';
    $styleValue = '';

    $attributes .= ' alt="' . $alt . '"';
    $attributes .= ' title="' . $alt . '"';
    if ( $width > 0 )
    {
      $attributes .= ' width="' . $width . '"';
    }
    if ( $height > 0 )
    {
      $attributes .= ' height="' . $height . '"';
    }

    $class = $this->params->get( 'thumbClass', '' );
    if ( $class )
    {
      $attributes .= ' class="' . $class . '"';
    }

    $imagePosition = $this->params->get( 'thumbPosition', 'left' );
    if ( $imagePosition )
    {
      $styleValue .= ' float:' . $imagePosition . ';';
    }
    $padding = $this->params->get( 'thumbPadding', -1 );
    if ( $padding >= 0 )
    {
      $styleValue .= ' padding:' . $padding . 'px;';
    }
    $margin = $this->params->get( 'thumbMargin', '' );
    if ( $margin and ( $margin[0] !== '-' /* a negative number starts with - */ ) )
    {
      $margin = JString::strtolower( $margin );
      $search = array( ' ', ';' );
      $replace = array( ',', ',' );
      $margin = JString::str_ireplace( $search, $replace, $margin );
      $marginList = explode( ',', $margin );
      $n = 0;
      while ( $n < count( $marginList ) )
      {
        if ( $marginList[ $n ] or ( $marginList[ $n ] === '0' ) )
        {
          if ( JString::strpos( '0123456789', $marginList[ $n ][ JString::strlen( $marginList[ $n ] ) - 1 ] ) === FALSE )
          {
            /* Ok, a unit is already appended */
          }
          else
          {
            $marginList[ $n ] .= "px";
          }
          $marginList[ $n ] = ' ' . $marginList[ $n ];
          $n++;
        }
        else
        {
          unset( $marginList[ $n ] );
          $marginList = array_values( $marginList ); /* re-index */
        }
      }
      $margin = implode( '', $marginList );
      $styleValue .= ' margin:' . $margin . ';';
    }
    $borderWidth = $this->params->get ( 'thumbBorderWidth', - 1 );
    if ($borderWidth >= 0) {
      $borderColor = $this->params->get ( 'thumbBorderColor', '#cccccc' );
      $borderStyle = $this->params->get ( 'thumbBorderStyle', '' );
      $styleValue .= ' border: ' . $borderWidth . 'px ' . $borderStyle . ' ' . $borderColor . ';';
    }
    if ( $styleValue )
    {
      $attributes .= ' style="' . $styleValue . '"';
    }

    return $attributes;
  }

  /**
   * Searches the given text for [token]...[/token] or {token}...{/token} constructs that must be removed.
   * @param string $text The text too operate on.
   * @note Possibly writes isShortened.
   * @return The stripped text.
   */
  private function _StripTokens( $text )
  {
    $settings = array (
        array ( 'pattern' => self::_tokenPattern,
            'opening' => '\[',
            'closing' => '\]',
            'tokens' => $this->_squareTokensToRemove
        ),
        array ( 'pattern' => self::_tokenPatternWithContents,
            'opening' => '\[',
            'closing' => '\]',
            'tokens' => $this->_squareTokensToRemoveWithContents
        ),
        array ( 'pattern' => self::_tokenPattern,
            'opening' => '{',
            'closing' => '}',
            'tokens' => $this->_curlyTokensToRemove
        ),
        array ( 'pattern' => self::_tokenPatternWithContents,
            'opening' => '{',
            'closing' => '}',
            'tokens' => $this->_curlyTokensToRemoveWithContents
        ) );
    /* Remove first without contents, then remove with contents. */
    foreach ( $settings as $setting )
    {
      foreach ( $setting[ 'tokens' ] as $token )
      {
        $search = array( self::_tokenOpeningReplacer, self::_tokenClosingReplacer, self::_tokenReplacer );
        $replace = array( $setting[ 'opening' ], $setting[ 'closing' ], $token );
        $pattern = JString::str_ireplace( $search, $replace, $setting[ 'pattern' ] );
        $count = 0;
        $text = preg_replace( $pattern, '', $text, -1, $count );
        if ( $count )
        {
          /* We have stripped away a - likely fancy - part of the article. The user must
           * get the possibility to access the full article - and thus that fancy part.
           */
          $this->_isShortened = true;
        }
      }
    }
    return $text;
  }

  /**
   * Cuts off the article text, retaining the full formatting. It uses regular expressions to find tags, and a simple
   * push/pop system to retain the opened but still-unclosed tags. When the text has been cut off after a
   * admin-configurable unit count, all the opened and still-unclosed tags are then closed.
   * @note No prefix nor suffix will be added in this function.
   * @post If the shortened string differs from the given @c text, @c _isShortened is set to @c true.
   * @param string $text RO. The HTML text to shorten.
   * @param integer $cutOffLength The size in number of @c _lengthUnit units of the plain text to retain, or @c false
   *   to indicate all text must be retained (safe the tags that must be removed according to the configuraion
   *   settings).
   * @return An array of strings: first 'the shortened text', second all 'the closing tags'. The second string may be
   *   empty - this indicates all text was to be retained, safe for the @c _tagsToRemove and
   *   @c _tagsToRemoveWithContents.
   */
  private function _CutOff( $text, $cutOffLength )
  {
    /* Treated as a fifo stack. A list of tags that have been opened but not yet closed. */
    $openTags = array();

    /* Portions of $text is continuously appended until the $cutOffLength is reached.
     * Will be returned as 'the shortened text'.
     */
    $shortened = array();

    /* Also the tag that follows whitespace is not immediately added to $shortened.
     * It is first stored in here.
     * When a new portion is found, this string is fully appended to $shortened.
     * When the loops ends, this string is expanded with all closing tags that still
     * need to be added (one for each opened tag that is still not yet closed) are
     * appended here at the end of this fucmtion, before returning.
     * Will be returned as 'the closing tags'
     */
    $closingTags = '';

    /* The total length of the plain text strings may not be bigger than the
     * maximum article length setting.
     */
    if ( $cutOffLength )
    {
      $nrOfUnitsYetToRetain = $cutOffLength;
    }
    else
    {
      $nrOfUnitsYetToRetain = PHP_INT_MAX;
    }

    /* Use an integer here, not a boolean.
     * If a tag is found which has to be removed with its content - i.e. it is
     * listed in @c _tagsToRemoveWithContents - we search for that specific
     * tagin the next loop. If can be that that same tag is nested, and that
     * an opening tag is found again. By using a counter we can be sure when
     * the outer closing tag has been found.
     */
    $removeAllUntilEndOfTag = 0;

    /* The position in bytes from where the search for the next match of the regular expression must start. */
    $offset = 0;

    /* A tag does not necessarily indicate the end of the 'word', 'sentence', or 'paragraph'.
     * When this boolean is false, the (first portion of the) next plaintext indicates the start of a new unit.
     * When this boolean is true, the (first portion of the) next plaintext belongs to the same 'word', etc.
     */
    $currentUnitIsOngoing = false;

    /* This is not a constant: normally we search for any tag, but when we know we have to skip portions
     * we can as well directly search for the corresponding end tag. This can be achieved by adapting the
     * tag pattern.
     */
    $tagPattern = JString::str_ireplace( self::_tagReplacer, self::_anyTag, self::_tagPattern );

    $continue = true;
    while ( $continue )
    {
      /* Find HTML tags. Each match is an array of (mostly) interesting data
       * about the tag - see @c _tagPattern. Using that, we can find the plain
       * text in front of it.
       */
      /* By using PREG_OFFSET_CAPTURE, each entry in the array returned will
       * be an array itself, containing the matched (sub)string and the starting
       * offset.
       */
      $matchCount = preg_match( $tagPattern, $text, $matches, PREG_OFFSET_CAPTURE, $offset );
      if ( !/*NOT*/ $matchCount or ( count( $matches ) < 4 ) )
      {
        /* No (more) HTML tags were found. We can not just assume that the last part
         * of the string is always a HTML tag, especially not when no wysiwig editor
         * has been used to create this article.
         * Fetch the remainder of text, and set the needed variables to some dummy value,
         * so that the loop can finish correctly.
         */
        $matchCount = preg_match ( "/.*/is", $text, $matches, PREG_OFFSET_CAPTURE, $offset );
        $plainText = $matches[0][0];
        $fullTag = "";
        $tag = "";
        $isSelfClosingTag = false;
        $isClosingTag = false;
        //$offset = /* Don't care */
        $continue = false;
      }
      else
      {
        $plainText = $matches[1][0];
        $fullTag = $matches[2][0];
        $tag = JString::strtolower( $matches[4][0] );

        /* Determine whether the tag we found is an opening tag (e.g. <abc>), a closing tag (e.g. </abc>)
         * or a self-closing tag (e.g. <abc />).
         * If a closing slash is present, it is captured by the regular expression, either in index 3 (<abc />),
         * either in the last-but-one index (<abc />) - and the last-but-one index is always greater than 3.
         */
        $isSelfClosingTag = $matches[ count( $matches) - 2 ][0] == '/';
        $isClosingTag = $matches[3][0] == '/';

        /* Those pesky html4 tags are still lingering around. Be sure to
         * correctly determine a tag as self-closing, even when no closing
         * slash was present. e.g. <br> vs. <br/>
         */
        if ( !/*NOT*/ $isClosingTag )
        {
          if ( in_array( $tag, $this->_extraSelfClosingTags ) )
          {
            $isSelfClosingTag = true;
          }
        }

        /* Prepare the next loop: the value of $offset determines where the next search starts. */
        $offset = $matches[ count( $matches ) - 1 ][1] + 1;
        /* $continue remains true for now. May become false below. */
      }

      if ( $removeAllUntilEndOfTag )
      {
        /* We're inside a block of code of which nothing may be retained in the cut-off text.
         * Do not add the plaintext and tag strings.
         */
        if ( $isClosingTag )
        {
          $removeAllUntilEndOfTag--;
          if ( $removeAllUntilEndOfTag <= 0 )
          {
            $tagPattern = JString::str_ireplace( self::_tagReplacer, self::_anyTag, self::_tagPattern );
          }
        }
        else
        {
          $removeAllUntilEndOfTag++;
        }
      }
      else
      {
        /* Determine the length of the just extracted portion of $text.
         * Depending on the outcome, and the current value of $currentUnitIsOngoing
         * that may need to be tweaked a bit.
         * e.g. we need to count in paragraphs, the match contains no plaintext and a paragraph ending:
         *   the current ongoing paragraph is then closed and must be counted.
         * e.g. we need to count in words, the match equals 'def ghi?<b>':
         *   the returned value will be two, but we may only count one if '?' equals 'j' (two if it equals ' ').
         * Also update $currentUnitIsOngoing to reflect the state after the current portion has been added.
         */
        $end = true;
        $length = ReadLessTextHelper::DetermineLength( $plainText . $fullTag, $this->_lengthUnit, $end );
        if ( $currentUnitIsOngoing and $end )
        {
          if ( !/*NOT*/ $length )
          {
            $length = 1;
          }
        }
        if ( $length and !/*NOT*/ $end )
        {
          $length--;
        }
        if ( $currentUnitIsOngoing )
        {
          if ( $end )
          {
            $currentUnitIsOngoing = false;
          }
        }
        else
       {
         if ( $length and !/*NOT*/ $end )
         {
           $currentUnitIsOngoing = true;
         }
        }

        /* Add the new plaintext. */
        if ( $length >= $nrOfUnitsYetToRetain )
        {
          $plainText = ReadLessTextHelper::Substr( $plainText, $nrOfUnitsYetToRetain, $this->_lengthUnit, $this->_retainWholeWords );
          $shortened[] = $plainText;
          $this->_isShortened = true;
          //$nrOfUnitsYetToRetain = /* Don't care */
          $continue = false;
        }
        else
        {
          $shortened[] = $plainText;
          $nrOfUnitsYetToRetain -= $length;
          /* $continue remains true. */
        }

        /* Determine what to append to the just-added plain text.
         * Also:
         * - update the list of opened-and-not-yet-closed tags and
         * - prepare the next loop (if there is another one).
         */
        if ( in_array( $tag, $this->_tagsToRemoveWithContents ) )
        {
          /* We don't know what will be stripped away in the shortened text:
           * it could be markup, a title or a table.
           * For sure is that the author wants this tag with its contents in the
           * full article, and that it may not taken along in the shortened
           * version. Even when all the remainder of the article fits in the
           * shortened text, it is best to ensure a pre- and/or suffix is
           * appended when done shortening.
           */
          $this->_isShortened = true;

          /* Do not add the tag. */
          if ( $isClosingTag or $isSelfClosingTag )
          {
            /* Nothing more to do. */
          }
          else
          {
            $removeAllUntilEndOfTag++;
            $tagPattern = JString::str_ireplace( self::_tagReplacer, $tag, self::_tagPattern );
          }
        }
        else if ( in_array( $tag, $this->_tagsToRemove )
            or in_array( 'all', $this->_tagsToRemove ) )
        {
          /* Do not add the tag. */
        }
        else if ( $isSelfClosingTag )
        {
          $shortened[] = $fullTag;
        }
        else if ( $isClosingTag )
        {
          $shortened[] = $fullTag;
          /* For simplicity, just assume at this point the text only contains
           * valid HTML, i.e. that all opening tags are properly closed in the
           * correct order. That means we do not need to check whether some
           * pushed opening tag matches with this closing tag: it just has to
           * be.
           */
          unset( $openTags[ count( $openTags ) - 1 ] );
          $openTags = array_values( $openTags ); /* re-index */
        }
        else if ( $tag )
        {
          if ( $continue )
          {
            /* The tag found is a valid opening tag that must remain in the cut-off text. */
            $shortened[] = $fullTag;
            $openTags[] = $tag;
          }
          else
          {
            /* No need to open a tag just at the point where we will stop. */
          }
        }
      }
    } /* while ( $continue ) */

    /* Not all parts of $shortened will become part of 'the shortened text'.
     * All last portions that are either
     * - a tag,
     * - an empty string,
     * - a whitespace string
     * will be added to 'the closing tags'.
     * Plus - after the removal of these elements - the then last plaintext string is right trimmed.
     * All this to allow to 'glue' the inline suffix right after the last retained plaintext
     * character.
     */
    $continue = true;
    $i = count( $shortened ) - 1;
    while ( $continue and ( $i > 0 ) )
    {
      if ( ( $shortened[ $i ] === '' ) /* an empty string */
          or ( substr_compare( $shortened[ $i ], '<', 0, 1 ) == 0 ) /* a tag */
          or ( ctype_space( $shortened[ $i ] ) ) ) /* a whitespace string */
      {
        $closingTags = $shortened[ $i ] . $closingTags;
        $shortened[ $i ] = '';
        $i--;
      }
      else
      {
        $continue = false;
      }
    }
    if ( $i > 0 )
    {
      $shortened[ $i ] = ReadLessTextHelper::Rtrim( $shortened[ $i ] );
    }
    $shortened = implode( '', $shortened );

    /* All tags that were opened and not yet closed are now closed here
     * in the correct order: i.e. in reverse order.
     */
    if ( count( $openTags ) > 0 )
    {
      $openTags = array_reverse( $openTags );
      $closingTags .= '</' . implode( '></', $openTags ) . '>';
    }

    return array ( $shortened, $closingTags );
  }

  /* *********************************************************************** */

  /**
   * Various options needed while operating on the text.
   * May only be set in _PrepareArticleText or _GetParams.
   * Once set, it is to be considered RO.
   * @{
   */
  private $_cache = null; /* Set correctly in _PrepareArticleText(). */

  private $_addPrefix = 'no'; /**< Must be checked after shortening, (if applicable) in combination with _isShortened. */
  private $_addInlineSuffix = 'no'; /**< Must be checked after shortening, (if applicable) in combination with _isShortened. */
  private $_addSuffix = 'no'; /**< Must be checked after shortening, (if applicable) in combination with _isShortened. */
  private $_respectExistingReadmoreLink = true; /* Set correctly in _GetParams() */
  private $_applyFormatting = 'no'; /**< Must be checked after checking the article's length, (if applicable) in combination with _isShortened. */
  private $_createThumbnail = 'no'; /**< Must be checked after shortening, (if applicable) in combination with _isShortened. */
  private $_linkThumbnail = true; /* Set correctly in _GetParams() */
  private $_thumbnailTitle = ''; /* Set correctly in _GetParams() */
  private $_prefix = ''; /* Set correctly in _GetParams() */
  private $_inlineSuffix = ''; /* Set correctly in _GetParams() */
  private $_suffix = ''; /* Set correctly in _GetParams() */
  private $_articleUrl = '.';
  private $_retainWholeWords = false;
  private $_crop = array( 'horizontal_position' => 'no', 'vertical_position' => 'no' );

  private $_cacheTime = 2419200 /* 4 weeks */;
  private $_thumbWidth = 0;
  private $_thumbHeight = 0;
  private $_minimum = array( 'width' => 0, 'height' => 0, 'ratio' => 0.05 );

  private $_extraSelfClosingTags = array();
  private $_tagsToRemove = array();
  private $_tagsToRemoveWithContents = array();
  private $_squareTokensToRemove = array();
  private $_curlyTokensToRemove = array();
  private $_squareTokensToRemoveWithContents = array();
  private $_curlyTokensToRemoveWithContents = array();

  private $_htmltext = ''; /* Set correctly in _PrepareArticleText() */
  private $_plaintext = ''; /* Set correctly in _PrepareArticleText() */
  private $_lengthUnit = 'char'; /* Set correctly in _PrepareArticleText() */
  private $_wordCount = 0; /* Set correctly in _PrepareArticleText() */
  private $_hash = 0; /* Set correctly in _PrepareArticleText(). */

  private $_wrapperTag = array( 'open' => '', 'close' => '' ); /* Set correctly in _PrepareArticleText(). */
  /** @} */

  /**
   * Can be set to true, when an existing manually inserted read more token
   * is found; or later on, when the formatting options cause the removal of
   * parts of the article; or when the article is automatically shortened and
   * some remainder of the article is excluded.
   * Once set to true, the variable may not be set to false again.
   */
  private $_isShortened = false; /* Reset in _GetParams() */
  /** @} /*

  /* *********************************************************************** */

  /**
   * Used to find an image tag in a text.
   *
   * A match found using this regular expression will return at each index:
   * [0] The complete @c img tag, inclusive the brackets and the attributes
   * [1] The value of @src attribute, i.e. the URL where the image can be fetched.
   * [last] The closing bracket. Used to know the precise end byte
   *     offset of the matched tag. Especially needed for multi byte strings
   *     (some of the attributes inside the tag might very well be that),
   *     since JString::strlen returns the number characters, not the number
   *     of bytes. The offset given to preg_match needs to be a byte offset.
   *
   * @note: It is not possible (or: I could not get it to work) to include correct
   *   positions together with the found matches when using non-ASCII UTF8 strings
   *   when using this pattern with preg_match.
   *   The matches returned seem correct though, and strpos can be used to fetch
   *   the starting UTF8 character index.
   * @note This is a simplified version of _tagPattern. Potentially this can
   *   match a great portion of the text, crossing several html tags, _if_ an img
   *   tag is given _without_ a src attribute. If this happens, give them what they
   *   are asking for. Or, in other words: don't worry about that.
   */
  const _imgPattern = '/<img.+?src\s*=\s*["\']([^"\']+)["\'][^>]*(>)/muis';
  /*                                           1111111            -1    */
  /*                    00000000000000000000000000000000000000000000    */

  /**
   * Used to find an content gallery token in a text.
   *
   * A match found using this regular expression will return at each index:
   * [0] The complete @c content gallery token, inclusive the gallery data and the closing token.
   * [1] The gallery data, i.e. the relative URL where the gallery images can be fetched.
   * [last] The closing bracket. Used to know the precise end byte offset of the matched tag. Especially needed for
   *   multi byte strings since JString::strlen returns the number characters, not the number of bytes. The offset given
   *   to preg_match needs to be a byte offset.
   */
  const _galleryPattern = '/{(gallery|vsig|ppgallery|becssg)}\s*([^<]+)\s*{\/\1}/muis';
  /*                                                             11111        -1     */
  /*                        0000000000000000000000000000000000000000000000000000     */

  /**
   * Used to parse an html text by finding all the HTML tags.
   * Thanks to http://kev.coolcavemen.com/2007/03/ultimate-regular-expression-for-html-tag-parsing-with-php/
   * It is a bit modified, to catch the tag without attributes and brackets,
   * the closing tag character '/', and the last char in the match as well.
   * @note Before usage, the string @c _tagReplacer in @c _tagPattern must be replaced with the tag to search for,
   *   or with @c _anyTag
   *
   * A match found using this regular expression will return at each index:
   * [0] The full match; i.e. the concatenation of everything below
   * [1] The plaintext preceding the tag
   * [2] The complete tag, inclusive the brackets and the attributes
   * [3] Either empty, either '/' when the tag is a closing tag.
   * [4] The tag name
   * [5] The full attributes - possibly not present
   * [6] ...
   * [last but one] If the tag is self closing: '/'. Else, and if attributes
   *     are present: the last attribute. Else: the empty string.
   * [last] The closing bracket. Used to know the precise end byte
   *     offset of the matched tag. Especially needed for multi byte strings
   *     (some of the attributes inside the tag might very well be that),
   *     since JString::strlen returns the number characters, not the number
   *     of bytes. The offset given to preg_match needs to be a byte offset.
   *
   * @note the @c xxx part is to be replaced
   * - replace with @c _anyTag to catch any tag
   * - replace with 'abc' to catch tag abc
   *
   * @{
   */
  const _tagPattern = "/(.*?)(<(\/?)(xxx)((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)(\/?)(>))/muis";
  /*                     111    333  444   --- one attribute --------------------------------------           -2   -1      */
  /*                                      --- all attributes from index 5 until index -3 ------------                      */
  /*                          222222222222222222222222222222222222222222222222222222222222222222222222222222222222222      */
  /*                    0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000     */
  const _tagReplacer = 'xxx';
  const _anyTag = '\w+';
  /** @} */

  /**
   * @li _tokenPattern Used to find third party token indications like
   *   {slider=MySlider}
   *   {gallery path/to/images}
   * @li _tokenPatternWithContents Used to find third party token indications like
   *   [pgn]...[/pgn]
   *   {slide}...{slide}...{slides}
   *
   * What can not be detected:
   * @li nested token codes
   * @li self closing token codes
   * @li escaped starts of token codes
   *
   * A match found using this regular expression will return at each index:
   * @li _tokenPattern
   *   [0] The complete token code, inclusive the opening and closing character.
   * @li _tokenPatternWithContents
   *   [0] The complete opening token, the complete closign token, and all text in between.
   *
   * @note the @c xxx, @c yyy and @c zzz parts are to be replaced
   * - replace @c xxx with [ or { or ... to catch the start of a token
   * - replace @c yyy with ] or } or ... to catch the end of a token
   *
   * @{
   */
  const _tokenPattern = "/xxx\s*.?\s*zzz.*?yyy/muis";
  const _tokenPatternWithContents = "/xxx\s*zzz.*?yyy.*?xxx\s*\/\s*zzzs?\s*yyy/muis";
  const _tokenOpeningReplacer = 'xxx';
  const _tokenClosingReplacer = 'yyy';
  const _tokenReplacer = 'zzz';
  /** @} */

//     private $profiler = null;
//     private $profiles = null;
}

?>
PK�j&]D�c6ee"readlesstext/readlesstextcache.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id$
 */

defined( '_JEXEC' ) or die;

class ReadLessTextCache
{
  /**
   * Constructor
   * @param string $rtable The table name where the item is stored.
   * @param uint $rid The item id in $rtable.
   * @param string $hash a fingerprint of the article. When the fingerprint doesn't match with the
   *   value stored in the database, the other fields are reset.
   */
  function __construct( $table, $rtable, $rid, $hash )
  {
    /* Must be set before calling _GetDataFromDb */
    $this->_table = $table;
    $this->_data[ 'rtable' ] = $rtable;
    $this->_data[ 'rid' ] = $rid;

    $this->_GetDataFromDb( $rtable, $rid );
    if ( array_key_exists( 'hash', $this->_data )
        and $this->_data[ 'hash' ]
        and ( $this->_data[ 'hash' ] == $hash ) )
    {
      /* Ok. Use the cached data. */
      $this->_dirty = false;
    }
    else
    {
      foreach ( array_keys( $this->_data ) as $key )
      {
        if ( $key != 'id' )
        {
          $this->_data[ $key ] = 0;
        }
      }
      $this->_data[ 'rtable' ] = $rtable;
      $this->_data[ 'rid' ] = $rid;
      $this->_data[ 'hash' ] = $hash;
      $this->_dirty = false; /* There is no need to store reset values. */
    }
  }

  /**
   * Retrieves the stored value for the given field.
   * @param string $field A field name, as stored in the database.
   * @note Possible fields are: 'char', 'word', 'sentence', 'paragraph', 'begin', 'end', 'url'.
   * @return @li 0 when the requested field or its field value could not be found. A valid value otherwise.
   */
  public function Get( $field )
  {
    $value = 0;
    if ( array_key_exists( $field, $this->_data ) )
    {
      $value = $this->_data[ $field ];
    }
    return $value;
  }

  /**
   * Sets or updates (a) value(s) for the given field(s).
   * @param mixed $field Either a field name, as stored in the database.
   *   Or an array of field names.
   * @param mixed value Either a fields value. It is assumed the values given can be converted to the stored database
   *   type.
   *   Or an array of field values.
   * @return void
   * @note The values are not yet stored in the database. Use @c Store() to make the changes permanent.
   * @see Store
   * @return void
   */
  public function Set( $field, $value )
  {
    if ( is_string( $field ) )
    {
      $set = array( $field => $value );
    }
    else
    {
      /* Assume is_array() */
      $set = array_combine( $field, $value );
    }
    foreach ( $set as $k => $v )
    {
      if ( isset( $this->_data[ $k ] ) and ( $this->_data[ $k ] == $v ) )
      {
        /* Nothing changed. No need to mark the data as changed. */
      }
      else
      {
        $this->_data[ $k ] = $v;
        $this->_dirty = true;
      }
    }
  }

  /**
   * Makes all changes permanent.
   */
  public function Store()
  {
    if ( $this->_dirty )
    {
      $this->_SetDataToDb();
      $this->_dirty = false;
    }
    else
    {
      /* Nothing changed. No need to write to the database. */
    }
  }

  /**
   * Fetches all known readlesstext data from the database of given article/item
   * @return void.
   * @post @c $this->_data will have been set to an associative array, with the
   *   field names as keys, and the field values as values, or to an empty array
   *   (when no stored data was found).
   */
  private function _GetDataFromDb()
  {
    $db = JFactory::getDBO();
    $query = 'SELECT *
        FROM ' . $this->_table . '
        WHERE rtable = ' . $db->Quote( $this->_data[ 'rtable' ] ) . '
        AND rid = ' . $db->Quote( $this->_data[ 'rid' ] );
    $db->setQuery( $query );
    $this->_data = $db->loadAssoc();
    if ( $this->_data )
    {
      unset( $this->_data[ 'last_update' ] );
    }
    else
    {
      $this->_data = array();
      /* rtable, rid, and hash will be filled in by the caller */
    }
  }

  /**
   * Writes all locally stored readlesstext data to the database of given article/item.
   * @note Both @c rtable and @c rid, given during construction, will be stored too.
   * @note If a record already exists, it will be updated; if not, a new one will be added.
   * @return void.
   */
  private function _SetDataToDb()
  {
    $db = JFactory::getDBO();

    $inserts = array();
    foreach ( $this->_data as $key => $value )
    {
      $inserts[ $db->quoteName( $key ) ] = $db->Quote( $value );
    }

    $updates = array();
    foreach ( $this->_data as $key => $value )
    {
      $updates[] = $db->quoteName( $key ) . '=' . $db->Quote( $value );
    }

    $query = 'INSERT INTO ' . $this->_table . ' (' . implode( ',', array_keys( $inserts ) ) . ')
        VALUES (' . implode( ',', $inserts ) . ')
        ON DUPLICATE KEY UPDATE ' . implode( ',', $updates );

    $db->setQuery( $query );
    $db->query();
  }

  private $_data = array(); /**< Local storage for all the readlesstext data. Keys correspond to the table fieldnames. */
  private $_dirty = false; /**< When @c False, no database write will be done. This eliminates needless writes. */
  private $_table = '#__readlesstext'; /**< The table name where readlesstext stores extra data about an article/item */
}
?>
PK�j&]��%�%Breadlesstext/language/en-GB/en-GB.plg_content_readlesstext.sys.ininu�[���; site language file for read less text
; Copyright Copyright (C) 2010-2014 parvus
; license GNU/GPL_GPLv3 http://www.gnu.org/copyleft/gpl.html
;
; This file is part of the Joomla! extension plugin read less text.
;
; read less text 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.
;
; read less text 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
; read less text. If not, see <http://www.gnu.org/licenses/>.
;
; @version $Id: en-GB.plg_content_readlesstext.sys.ini 273 2014-11-26 20:43:05Z parvus $

PLG_CONTENT_READLESSTEXT_DESCRIPTION="<h2>v5.2 (r274)</h2><p><em>read less text</em> will control the article text: preview size, formatting and image placement can be adjusted to your liking, precisely on those pages and for those articles or items you want. <em>read less text</em> will not alter your article tables in any way. Only the display is controlled: uninstalling or disabling will bring back the original text.</p><p><em>It is advised to use the <code>Discover</code> mode should you want fine-grained control on when and where read less text is to be active. You can enable and disable the <code>Discover</code> mode in the section <code>When active</code>.</em></p><p>This version does not affect the article's titles. If you want to control the title length, prepend or append specific information, and adjust the casing of the title, you can install and use the separate extension <em><a href='http://extensions.joomla.org/extensions/style-a-design/titles/16619/'>read less title.</a></em></p><p>A companion plugin <em><a href='http://joomlacode.org/gf/project/cutoff/frs/'>read less text again</a></em> lets you define a second set of settings: whenever you want articles to be shortened or reformatted differently depending on the page they are shown, or depending on the location on the page they are shown, this companion plugin is made for you.</p><h2>Contexts - Quick</h2> <p>Check the table below to quickly configure the plugin: <table><tr><th><code>When Active</code> &gt; <code>Allowed</code></th> <th><em>only</em> active on</th></tr> <tr><td><code>frontpage</code></td> <td>the frontpage of your site</td></tr> <tr><td><code>category</code></td> <td>all the category blog pages</td></tr> <tr><td><br /><code>category=12</code></td> <td>the blog page of<br />the category with id 12</td></tr> <tr><td><code>135</code></td> <td>the article with id 135 <br /> on all blog and article pages</td></tr> </table></p> <ul><li>Most users will want to activate <em>read less text</em> for all the article blog pages. They can choose to select the quick configuration in which case the fields <code>Allowed</code> and <code>Disallowed</code> will be ignored.</li> <li><em>read less text</em> can not be active on a list layout of articles - this is a technical limitation.</li> <li>It is possible to be active on a list layout of other components - this entirely depends on the implementation of that component.</li></ul> <h2>Tokens</h2> <p><em>read less text</em> can add specific HTML both in front and at the end of each article. Both prefix and suffix may contain <em>token</em>s. A <em>token</em> is a special keyword that is surrounded by curly brackets. <ul>The following <em>tokens</em> are recognized: <li><code>{title}</code>, <code>{id}</code>, <code>{url}</code><br /><code>{author}</code>, <code>{author_id}</code><br /><code>{words}</code>, <code>{hits}</code><br /><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code><br /i><code>{category}</code>, <code>{category_id}</code><br /><code>{component}</code></li></ul></p> <p><em>Token</em>s are replaced for each article, using the article's specific information. Those tokens that are replaced with dates will be formatted according to the format you provide in the field <code>Date Format</code>. You can review the <a href='http://php.net/manual/en/function.date.php'>manual for the function <code>date</code></a> for a list of formatting characters and their explanation, and for a list of examples.<br/>The <code>{title}</code> token can be displayed shortened as well: if you use <a href='index.php?option=com_plugins&view=plugins&filter_search=read'><em>read less title</em></a>, and have ensured that the ordering number is lower than the ordering number of <em>read less text</em>, the shortened title will be used. This will work even if you selected not to display titles under <code><a href='index.php?option=com_content'>Article Manager</a> &gt; Options &gt; Articles</code> by setting the option <code>Show Title</code> to <code>Hide</code>.</p> <h2>Contexts - Slow</h2> <p> You can very precisely configure when this plugin may be active and when not. This is done by listing <em>contexts</em> in the <code>Allowed</code> and <code>Disallowed</code> fields. A <em>context</em> is simply a combination of a component name, the name of a view and an article id, separated by a single colon <code>:</code>.<ul><li>The component name may be omitted - in that case <code>com_content</code> is assumed.</li> <li>The view name may be omitted - in that case it is assumed all views are targeted.</li> <li>The article id may be omitted - in that case it is assumed all articles on the page are targeted.</li><li>The last part, where the article id can be given, has one special shortcut: <code>all-in-&lt;n&gt;</code>, where <code>&lt;n&gt;</code> is to be replaced with the id of a category. In that case all articles in the given category <code>&lt;n&gt;</code> are targeted.</li> </ul></p> <p>The table above already gave some examples. Should you want a very fine-grained control: you easily can.</p> <h2>Contexts - Discover</h2> <p>To know if it is possible for <em>read less text</em> to operate on a specific page, and to know the precise component name and view which is used on that page, you can enable the <code>Discover</code> mode. In <code>Discover</code> mode, <em>read less text</em> will replace the article's text or any component's <em>Item</em> text - if applicable - with the information you need to be able to fully verify and adjust your configuration.</p> <p>The <code>Discover</code> mode is only applied for users which have back-end access: you can thus safely activate the option and still be assured all your regular users continue to see your site as intended.</p> <h2>Contexts - Two more examples</h2> <p>Suppose you have as configuration:</p> <table><tr><th>Field</th> <th>Value</th></tr> <tr><td><code>Quick Configuration</code></td> <td><code>No, use the fields below</code></td></tr> <tr><td><code>Allowed</code></td> <td><code>frontpage, category, com_eventlist:venues</code></td></tr> <tr><td><code>Disallowed</code></td> <td><code>38, 245, 246, category=7, com_eventlist:venues:28</code></td></tr></table></p> <p> <ul>In this case <em>read less text</em> will:<li>Never be active on the text of the articles with id 38, 245 and 246, regardless where and on what kind of page the article is shown.</li> <li>Not be active when displaying the blog page of category 7.</li> <li>Be active on all articles on all other blog pages, including any category blog page within category 7.</li> <li>Be active on the articles on the frontpage except the articles with id 38, 245 and 246.</li> <li>Be active on all venues on all EventList's detailed venue list pages except for the specific venue with id 28</li></ul></p> <p>Suppose you have as configuration:</p> <table><tr><th>Field</th> <th>Value</th></tr> <tr><td><code>Restrict Access For Guests</code></td> <td><code>Yes</code></td></tr> <tr><td><code>Quick Configuration</code></td> <td><code>No, use the fields below</code></td></tr> <tr><td><code>Allowed</code></td> <td><code>blog, categories, category, featured</code></td></tr> <tr><td><code>Disallowed</code></td> <td><code>all-in-7</code></td></tr></table></p> <p> <ul>In this case <em>read less text</em> will:<li>Active on all content blog pages when a user is logged in,</li> <li>always be active on all content pages when a user is <em>not</em> logged in (i.e. is a guest),</li> <li><em>except</em> for all articles in category <code>7</code>, which <em>read less text</em> will never try to shorten - not even for guests, regardless the page on which they are shown.</li></ul></p><hr/><h2>Thank you!</h2><ul>You can show your appreciation - should there be any - by<li><em>helping yourself</em>. <a href='http://joomlacode.org/gf/project/cutoff/tracker/?action=TrackerItemBrowse&tracker_id=9352'>Report bugs</a> and <a href='http://joomlacode.org/gf/project/cutoff/tracker/?action=TrackerItemBrowse&tracker_id=9351'>request missing functionality</a>: everybody's time is limited, but most likely you won't get what you don't ask for.</li><li><em>helping other administrators</em>. <a href='http://extensions.joomla.org/extensions/news-display/article-elements/articles-summary/12432'>Rate my extension</a> and leave a correct review: the height of the rating and the tone of the reviews are important decision factors for potential new users.</li><li><em>helping me</em>. <a href='https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=L9P4GMDWRKGUN'>Make a donation (PayPal)</a>: any gift is gratefully accepted, and you can be sure to have boosted my motivation!</li></ul>"
PK�j&]�h��a�a�>readlesstext/language/en-GB/en-GB.plg_content_readlesstext.ininu�[���; site language file for read less text
; Copyright Copyright (C) 2010-2014 parvus
; license GNU/GPL_GPLv3 http://www.gnu.org/copyleft/gpl.html
;
; This file is part of the Joomla! extension plugin read less text.
;
; read less text 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.
;
; read less text 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
; read less text. If not, see <http://www.gnu.org/licenses/>.
;
; @version $Id: en-GB.plg_content_readlesstext.ini 273 2014-11-26 20:43:05Z parvus $

; Sections
COM_PLUGINS_FORMATTING_FIELDSET_LABEL="Formatting"
COM_PLUGINS_INFO_FIELDSET_LABEL="Information"
COM_PLUGINS_LENGTH_FIELDSET_LABEL="Length"
COM_PLUGINS_PREFIX_FIELDSET_LABEL="Prefix"
COM_PLUGINS_SUFFIX_FIELDSET_LABEL="Read More (Suffix)"
COM_PLUGINS_THUMBNAIL_FIELDSET_LABEL="Thumbnail"
COM_PLUGINS_WHEN-ACTIVE_FIELDSET_LABEL="When Active"

; Options
PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX="Add Inline Suffix"
PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX_DESCRIPTION="Custom text can be added to the shortened (or not) article. The next fields below can be added <em>before</em> all tags have been <br/>closed. In practice this means the text you specify will look inline with the last part of the text: it will also have the same <br/>x formatting applied.<br />Choose here when the options that follow may be applied.<ul><li>Select <code>No</code> to not add any text.</li><li>Select <code>Always when read less text may be active</code> to apply all options when the constraints as set in the section <br/><em>When Active</em> are met. The options below will then be applied, regardless of the length of the article, and whether <br/>the article is shortened or not.</li><li>Select <code>Respect global option Show 'Read More'</code> to apply all options when <em>read less text</em> may be active, and when <br/>allowed by the aforementioned option in the <em>Article Manager</em>.</li><li>Select <code>Only when the article is shortened</code> to apply the options below when both the constraints as set in the <br/>section <em>When Active</em> are met, and the article is shortened (due to the <code>Shortened Text Length</code> or an existing <br/><em>Read More</em> which is to be respected as set in the <em>Length</em> section; or due to removed tags or tokens as set in the <br/><em>Formatting</em> section).</li></ul>"

PLG_CONTENT_READLESSTEXT_ADD_PREFIX="Add Prefix"
PLG_CONTENT_READLESSTEXT_ADD_PREFIX_DESCRIPTION="Choose here when the options in this section may be applied.<ul><li>Select <code>No</code> to disable all options in this <em>Prefix</em> section.</li><li>Select <code>Always when read less text may be active</code> to apply all options when the constraints as set in the section <br/><em>When Active</em> are met. The options below will then be applied, regardless of the length of the article, and whether the <br/>article is shortened or not.</li><li>Select <code>Only when the article is shortened</code> to apply the options below when both the constraints as set in the <br/>section <em>When Active</em> are met, and the article is shortened (due to the <code>Shortened Text Length</code> or an existing <br/><em>Read More</em> which is to be respected as set in the <em>Length</em> section; or due to removed tags or tokens as set in the <br/><em>Formatting</em> section).</li></ul>"

PLG_CONTENT_READLESSTEXT_ADD_SUFFIX="Add Read More (Suffix)"
PLG_CONTENT_READLESSTEXT_ADD_SUFFIX_DESCRIPTION="Custom text can be added to the shortened (or not) article, replacing the default <em>Read More</em> text. The next fields below can <br/>be added <em>after</em> all tags have been closed. In practice this means the text you specify will look as a separate paragraph <br/>appended below the text.<br />Choose here when the options that follow may be applied.<ul><li>Select <code>No</code> to not add any text.</li><li>Select <code>Always when read less text may be active</code> to apply all options when the constraints as set in the <br/>section <em>When Active</em> are met. The options below will then be applied, regardless of the length of the article, and whether <br/>the article is shortened or not.</li><li>Select <code>Respect global option Show 'Read More'</code> to apply all options when <em>read less text</em> may be active, and when <br/>allowed by the aforementioned option in the <em>Article Manager</em>.</li><li>Select <code>Only when the article is shortened</code> to apply the options below when both the constraints as set in the <br/>section <em>When Active</em> are met, and the article is shortened (due to the <code>Shortened Text Length</code> or an existing <br/><em>Read More</em> which is to be respected as set in the <em>Length</em> section; or due to removed tags or tokens as set in the <br/><em>Formatting</em> section).</li></ul>"

PLG_CONTENT_READLESSTEXT_ALLOWED="Allowed"
PLG_CONTENT_READLESSTEXT_ALLOWED_DESCRIPTION="Enter here a <em>comma</em> separated list of <em>contexts</em>. See the explanation aside for a full overview. If not empty, the plugin will <em>only</em> be active on articles or <em>items</em> in the given contexts. If empty, there is no restriction. <strong>When <code>Discover</code> mode is enabled, full context information for each article can be displayed.</strong>"

PLG_CONTENT_READLESSTEXT_ALWAYS_ACTIVE_FOR_GUESTS="Restrict Access<br />For Guests"
PLG_CONTENT_READLESSTEXT_ALWAYS_ACTIVE_FOR_GUESTS_DESCRIPTION="With this setting you can enforce all visitors of your site to log in before they can read the entire article's text.<br />When enabled, the setting <code>Allowed</code> is expanded with <code>, com_content</code> when a guest is requesting to view the page: <br/><em>read less text</em> will then always be active for all articles in <code>com_content</code>, except in the <em>context</em>s listed in <code>Disallowed</code>.<br/><strong>Note:</strong> If access is restricted, you will likely want to adapt the settings that may link to the full article: <br/><code>Prefix For Guests</code> under <code>Prefix</code> and/or <code>Suffix For Guests</code> under <code>Read More (Suffix)</code> - whichever has <br/>the option <code>... links to full article</code> set to <code>Yes</code>. There you can ensure your guests are redirected to a login page <br/>or a subscription page instead whenever they want to read the full article."

PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING="Apply Formatting<br />Options"
PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING_DESCRIPTION="<ul>Choose here when all options below in this section may be applied. <li>Select <code>No</code> to disable all options below in this <em>Formatting</em> section.</li><li>Select <code>Always when read less text may be active</code> to apply all options when the constraints as set in the section <em>When Active</em> are met. The options below will then be applied, regardless of the length of the article, and whether the article is shortened or not.</li><li>Select <code>Always when active and the article is long enough</code> to apply all options below when both the constraints as set in the section <em>When Active</em> are met, and the article is <em>long enough</em> (determined by the settings <code>Minimum Text Length</code> and <code>Respect Position Existing Read More</code>).</li></ul>"

PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SHORTEN_COUNT="# to shorten"
PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SHORTEN_COUNT_DESCRIPTION="Enter a number. For any given page, this indicates the number of articles that may be shortened, <strong>after</strong> skipping the above configured number of articles. All other articles that are prepared for display after this count has been reached will not be shortened. <br /><strong>Note:</strong> Enter 0 to shorten all articles or items (after skipping the above configured number)."

PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SKIP_COUNT="# to skip"
PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SKIP_COUNT_DESCRIPTION="Enter here a number. For any given page, this indicates the number of articles that must be skipped and may not be shortened.<br />Only after skipping this many articles or items, <em>read less text</em> will check the <em>Length</em> constraints and the other constraints set below, and possibly shorten the remainder of the articles or items.<br /><strong>Note:</strong> Enter 0 to not skip any article."

PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE="Within component scope"
PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE_DESCRIPTION="This option and the option below further restricts the usage of <em>read less text</em>. When a page is built, the output of any component - not just <code>com_content</code> - can contain article text. In most cases, this component allows plugins like <em>read less text</em> to intervene, to enhance the output (technical: the <code>onContentBeforeDisplay</code> event is fired). Some examples are <em>Eventlist</em> (<code>com_eventlist</code>) and <em>FJ Related Articles Blog and List Component</em> (<code>com_fjrelated</code>).<br />With this option you can choose if <em>read less text</em> must follow the context rules below, or may never be active on any component output. If the latter choice is made, the options <code>Quick Configuration?</code>, <code>Allowed</code> and <code>Disallowed</code> below are ignored for component output."

PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL="Create Thumbnail"
PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL_DESCRIPTION="<em>Read Less Text</em> can search for an image in the <em>full</em>text that meets the given criteria, and resize and move the first image <br/>as a thumbnail to the beginning of the article.<ul><li>Select <code>No</code> to disable all options in this <em>Thumbnail</em> section.</li><li>Select <code>Always when read less text may be active</code> to apply all options when the constraints as set in the section <br/><em>When Active</em> are met. The options below will then be applied, regardless of the length of the article, and <br/>whether the article is shortened or not.</li><li>Select <code>Only when the article is shortened</code> to apply the options below when both the constraints as set in <br/>the section <em>When Active</em> are met, and the article is shortened (due to the <code>Shortened Text Length</code> or an existing <br/><em>Read More</em> which is to be respected as set in the <em>Length</em> section; or due to removed tags or tokens as set in <br/>the <em>Formatting</em> section).</li></ul><strong>Note:</strong> All images not passing the criteria set here are ignored and left in place. <br/>If you want all images but one to be removed from the shortened text, you can add <code>img</code> to the setting <code>Tags To Remove</code>."

PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION="Horizontal Crop"
PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION_DESCRIPTION="When the ratio of the original image sizes and the ratio of the desired thumbnail sizes are not equal <em>(which is nearly always)</em>, we can crop in one direction, cutting of the extraneous portion of the image. The resulting resized image then has the exact desired thumbnail sizes. Here you can define which portion of the image may be cut off, if horizontal cropping needed.<br /><strong>Note:</strong> You can disable cropping in this direction: this may have as consequence that the resized </em>height will become less</em> than the configured thumbnail size."

PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION="Vertical Crop"
PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION_DESCRIPTION="When the ratio of the original image sizes and the ratio of the desired thumbnail sizes are not equal <em>(which is nearly always)</em>, we can crop in one direction, cutting of the extraneous portion of the image. The resulting resized image then has the exact desired thumbnail sizes. Here you can define which portion of the image may be cut off, if vertical cropping needed.<br /><strong>Note:</strong> You can disable cropping in this direction: this may have as consequence that the resized </em>width will become less</em> than the configured thumbnail size."

PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE="{tokens} To Remove"
PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_DESCRIPTION="Enter a list of <em>comma</em> separated words without { } markers, which must be removed in the text. <br /><strong>Note:</strong> When a token is removed due to this option, the article is considered to be shortened. According to the settings in the other sections, a thumbnail, a prefix, inline suffix and/or suffix may be added as a result. <br /><strong>Example:</strong> If you use the extension plugin <em>NoNumbers Slides</em>, you may have added something like <code>{slider somename}</code> to your content article, to transform portions of your content into slides. You can get rid of it in the shortened article by listing <code>slider</code> here."

PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_WITH_CONTENTS="{tokens} To Remove<br />With Contents"
PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION="Enter a list of <em>comma</em> separated words without { } markers, which must be removed in the text <strong>together with all the text that is present between the opening and the closing token</strong>.<br /><strong>Note:</strong> Self-closing tokens are not supported.<br /><strong>Note:</strong> When a token with its full contents is removed due to this option, the article is considered to be shortened. According to the settings in the other sections, a thumbnail, a prefix, inline suffix and/or suffix may be added as a result.<br /><strong>Example:</strong> If you use the extension plugin <em>Tabs & slides</em>, you may have added something like <code>{slide=somename}slide content{/slide}</code> to your content article. You can get rid of it in the shortened article by listing <code>slide</code> here."

PLG_CONTENT_READLESSTEXT_CUT_OFF_TEXT_LENGTH="Shortened Text Length"
PLG_CONTENT_READLESSTEXT_CUT_OFF_TEXT_LENGTH_DESCRIPTION="Enter a number. That number is expressed in the unit as selected below in <code>Length Unit</code>. When the article text is shortened, this many <em>units</em> will be retained. This number may be larger or smaller than the number above."

PLG_CONTENT_READLESSTEXT_DATE_FORMAT="Date Format"
PLG_CONTENT_READLESSTEXT_DATE_FORMAT_DESCRIPTION="Tags replaced with dates are formatted according this format. See the manual of the PHP function <code>date</code> for a list of formatting characters and their explanation, and for a list of examples. (A URL can be found in the help text aside.)<br /><strong>Example:</strong> <em>Monday, December 3</em> can be formatted as <code>l, F j</code><br /><strong>Example:</strong> <em>Mon 06:28</em> can be formatted as <code>D H:i</code><br /><strong>Example:</strong> <em>2012-07-28</em> can be formatted as <code>Y-m-d</code>"

PLG_CONTENT_READLESSTEXT_DEFAULT_THUMBNAIL_TEMPLATE="Default Thumbnail"
PLG_CONTENT_READLESSTEXT_DEFAULT_THUMBNAIL_TEMPLATE_DESCRIPTION="Enter the template of the path to the thumbnail to use when no suitable image has been found in the article. <br/>The path may be absolute, or relative to the root of your Joomla! installation. <br/>Tags in the given template will be expanded per article.<br /><em>read less text will resize, crop and cache the given thumbnail according to the setting made below, <br/>just like any image found within the article. The constraints however, are not checked.</em><br /><strong>Note:</strong> Leave this field empty to not insert a default thumbnail when no suitable image has been found.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Note:</strong> If - after expanding the tags - the default thumbnail file can not be found, no thumbnail is inserted."

PLG_CONTENT_READLESSTEXT_DISALLOWED="Disallowed"
PLG_CONTENT_READLESSTEXT_DISALLOWED_DESCRIPTION="Enter here a <em>comma</em> separated list of <em>contexts</em>. See the help text aside for a quick overview on how these look like. If not empty, the plugin will <em>never</em> be active on articles or <em>Items</em> in the given contexts. If empty, there is no restriction. This list prevails over the list <code>Allowed</code> above. <strong>When <code>Discover</code> mode is enabled, full context information for each article can be displayed.</strong>"

PLG_CONTENT_READLESSTEXT_DISCOVER="<strong>Discover</strong>"
PLG_CONTENT_READLESSTEXT_DISCOVER_DESCRIPTION="Enabling this replaces the article's text with all information you need to configure the options in this section. <br/><strong>Only users that are allowed back-end access will see any effect: <br/>your normal users will continue to see the articles as intended.</strong> <br/>With this extra information, you can find out whether the plugin is active on each article, and what the precise <br/>context strings are for each article. Using the context strings, you can then fill in the <code>Allowed</code> &amp; <code>Disallowed</code> <br/>fields to have your unique configuration."

PLG_CONTENT_READLESSTEXT_EXTRA_SELF_CLOSING_TAGS="Non XHTML-compliant<br />&lt;tags&gt;"
PLG_CONTENT_READLESSTEXT_EXTRA_SELF_CLOSING_TAGS_DESCRIPTION="Enter a list of <em>comma</em> separated HTML tags without &lt; &gt; markers, for which the closing tag or the closing character <code>/</code> may be absent. As an example, consider the <code>br</code> tag. If not properly self-closed (i.e. if a trailing slash <code>/</code> is not added), this plugin might otherwise generate extra undesired whitespace by adding an additional closing tag.<br /><strong>A good choice seems <code>br, hr, img</code></strong>.<br /><strong>Note:</strong> This setting is applied regardless of the value of <code>Apply Formatting Options</code>."

PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX="Inline Suffix For Guests"
PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_DESCRIPTION="<strong>For guests only.</strong> Enter here the text to add right after the last character of the article, before closing all tags. <br/>You can provide HTML code here.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Note:</strong> The default suffix just appends three dots. To reload the default value, just clear the <br/>text field and save the configuration.<br/><strong>Note:</strong> If the option <code>Enable Multi-language support?</code> is enabled, all text, including the HTML code, must be replaced with <br/>a placeholder; a placeholder is <strong>one</strong> word that must be used to define the real prefix - per language - under the <br/><em>Language Manager</em>.<br /><strong>Note:</strong> <code>url</code> will <em>always</em> point to the (SEO-optimized) url where the full article is to be found. If you have enabled the option <br/><code>Restrict Access For Guests</code> in the section <code>When active</code>, you likely don't want to use this token; replace it with <br/>the url to your login page, e.g. <code>index.php?option=com_users&amp;view=login&amp;Itemid=102</code>"

PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE="Guest inline suffix links to<br />full article"
PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>For guests only.</strong> If this option is enabled the suffix (text or HTML) will be wrapped and given as a link: when clicked, the guest is directed to the full article. If this option is disabled, you will have to provide another means for the guest to access the full article: by linking the title, by ensuring a thumbnail is generated, or by providing the desired HTML code yourself in the suffix. In the latter case, you can use the <code>{url}</code> token in combination with HTML tag <code>a</code>."

PLG_CONTENT_READLESSTEXT_GUEST_PREFIX="Prefix For Guests"
PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_DESCRIPTION="<strong>For guests only.</strong> Enter here the text to add before the article. <br/>You can provide HTML code here.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><br /><strong>Note:</strong> Leave empty to not prepend the article.<br/><strong>Note:</strong> If the option <code>Enable Multi-language support?</code> is enabled, all text, including the HTML code, must be replaced <br/>with a placeholder; a placeholder is <strong>one</strong> word that must be used to define the real prefix - per language - under the <br/><em>Language Manager</em>.<br /><strong>Note:</strong> <code>url</code> will <em>always</em> point to the (SEO-optimized) url where the full article is to be found. If you have enabled the option <br/><code>Restrict Access For Guests</code> in the section <code>When active</code>, you likely don't want to use this token; replace it with the url to your login page, e.g. <code>index.php?option=com_users&amp;view=login&amp;Itemid=102</code>"

PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_LINKS_TO_FULL_ARTICLE="Guest prefix links to<br />full article"
PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>For guests only.</strong> If this option is enabled the prefix (text or HTML) will be wrapped and given as a link: when clicked, the guest is directed to the full article. If this option is disabled, you will have to provide another means for the guest to access the full article: by linking the title, by ensuring a thumbnail is generated, or by providing the desired HTML code yourself in the prefix. In the latter case, you can use the <code>{url}</code> token in combination with HTML tag <code>a</code>."

PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX="Suffix For Guests"
PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_DESCRIPTION="<strong>For guests only.</strong> Enter here the text to add after the article. This value replaces the default <em>Read More</em> text. <br/>You can provide HTML code here.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Note:</strong> The default suffix mimics the standard <em>Read more</em> code Joomla! provides. To reload the default value, just clear the <br/>text field and save the configuration.<br/><strong>Note:</strong> If the option <code>Enable Multi-language support?</code> is enabled, all text, including the HTML code, must be replaced with <br/>a placeholder; a placeholder is <strong>one</strong> word that must be used to define the real prefix - per language - under the <br/><em>Language Manager</em>.<br /><strong>Note:</strong> <code>url</code> will <em>always</em> point to the (SEO-optimized) url where the full article is to be found. If you have enabled the option <br/><code>Restrict Access For Guests</code> in the section <code>When active</code>, you likely don't want to use this token; replace it with the url to <br/>your login page, e.g. <code>index.php?option=com_users&amp;view=login&amp;Itemid=102</code>"

PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_LINKS_TO_FULL_ARTICLE="Guest suffix links to<br />full article"
PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>For guests only.</strong> If this option is enabled the suffix (text or HTML) will be wrapped and given as a link: when clicked, the guest is directed to the full article. If this option is disabled, you will have to provide another means for the guest to access the full article: by linking the title, by ensuring a thumbnail is generated, or by providing the desired HTML code yourself in the suffix. In the latter case, you can use the <code>{url}</code> token in combination with HTML tag <code>a</code>. <br /><strong>Note:</strong> The default suffix mimics the standard <em>Read more</em> code Joomla! provides and already includes the <code>{url}</code> token in combination with the correct HTML tags: this option is best turned off in that case."

PLG_CONTENT_READLESSTEXT_LENGTH_UNIT="Length Unit"
PLG_CONTENT_READLESSTEXT_LENGTH_UNIT_DESCRIPTION="Select here the unit in which the two numbers above - both <code>Minimum Text Length</code> and <code>Shortened Text Length</code> - are expressed.<ul>Remarks and limitations:<li>A space or a tab is also counted as a <code>char</code>; however, subsequent whitespace is treated as one char.</li><li>Two <code>words</code> in the same paragraph must be separated by whitespace to be recognized as such.<br/>Two words with only a dot . in between (as in <em>this.that</em>) are counted as one word.</li><li>Two <code>sentences</code> are assumed to be separated by one of these characters: <code>. ? ! ¿</code> <br/>or by a paragraph ending, the end of a row in a table, a new bulleted or numbered item in a list. <br/>Subsequent sentence endings (for example, as in <code>What?!?!!</code>) are counted as one sentence ending. <br/>Two sentences with no whitespace in between (for example, as in <em>Been there.Done that</em>) are counted as two sentences.<br /><em>If your articles contain a lot of acronyms and/or versions (for example <code>R.E.M.</code>, <code>Joomla! 2.5.99</code>), <br/>the option <code>sentence</code> is less likely to give a satisfactory result.</em></li><li>A closing <code>p</code> tag is recognized as a <code>paragraph</code> ending (HTML code: <code>&lt;/p&gt;</code>), as is the end of a bulleted or numbered list. <br/>Title tags (such as <code>h1</code>, <code>h2</code>, etc.) are not counted. Empty paragraps are not counted.</li></ul>"

PLG_CONTENT_READLESSTEXT_LINK_THUMBNAIL="Create Link"
PLG_CONTENT_READLESSTEXT_LINK_THUMBNAIL_DESCRIPTION="Select <code>Yes</code> to create link of the thumbnail: when the user clicks on the thumbnail, the full article is shown."

PLG_CONTENT_READLESSTEXT_MAX_IMAGE_LOAD_TIME="Maximum Image<br />Load Time"
PLG_CONTENT_READLESSTEXT_MAX_IMAGE_LOAD_TIME_DESCRIPTION="Enter a number. <em>read less text</em> will abort the attempt to create a thumbnail from a remote image if this takes longer than this many seconds.<br />A very long loading time is usually caused by a not-responsive remote server; should this possibly occur, you can lower the loading time of your own pages to more acceptable levels by using a value of e.g. <code>2</code>. <br /><strong>Note:</strong> Enter <code>0</code> or leave blank to use the maximum time <em>read less text</em> is prepared to wait. This is currently set to <code>11</code> seconds."
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_HEIGHT="Minimum Height"
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_HEIGHT_DESCRIPTION="Enter a number. Only images which have a <strong>height</strong> in pixels greater than or equal to this number are considered as a potential thumbnail.<br />The first image that meets all conditions is resized and inserted in the shortened text.<br><strong>Note:</strong> All images not passing the criteria set here are ignored and left alone. If you want all images but one to be removed from the shortened text, you can add <code>img</code> to the setting <code>Tags To Remove</code>."
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_RATIO="Minimum Ratio"
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_RATIO_DESCRIPTION="Enter a number between 0 and 1. Only images which have a <strong>ratio</strong> in percentage greater than or equal to this number are considered as a potential thumbnail.<br /><strong>Examples</strong>: a square has a ratio of <code>1.00</code>; and a ratio of <code>0.25</code> means that either the width is four times larger than the height or the height is four times larger than the width.<br />The first image that meets all conditions is resized and inserted in the shortened text.<br><strong>Note:</strong> All images not passing the criteria set here are ignored and left alone. If you want all images but one to be removed from the shortened text, you can add <code>img</code> to the setting <code>Tags To Remove</code>."
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_WIDTH="Minimum Width"
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_WIDTH_DESCRIPTION="Enter a number. Only images which have a <strong>width</strong> in pixels greater than or equal to this number are considered as a potential thumbnail.<br />The first image that meets all conditions is resized and inserted in the shortened text.<br><strong>Note:</strong> All images not passing the criteria set below are ignored and left alone. If you want all images but one to be removed from the shortened text, you can add <code>img</code> to the setting <code>Tags To Remove</code>."
PLG_CONTENT_READLESSTEXT_MINIMUM_TEXT_LENGTH="Minimum Text Length"
PLG_CONTENT_READLESSTEXT_MINIMUM_TEXT_LENGTH_DESCRIPTION="Enter a number. That number is expressed in the unit as selected below in <code>Length Unit</code>. If the full length of the text in the selected unit is less than this number, this plugin will not shorten the text.<br/><strong>Note:</strong> Enter <code>0</code> to disable this restriction."
PLG_CONTENT_READLESSTEXT_MODULE_SCOPE="Within module scope"
PLG_CONTENT_READLESSTEXT_MODULE_SCOPE_DESCRIPTION="This option and the option above further restricts the usage of <em>read less text</em>. When a page is built, the output of one or more different modules can also contain artcile text. In some cases, these modules allow plugins like <em>read less text</em> to intervene, to enhance the output (technical: the <code>onContentBeforeDisplay</code> event is fired). An example is the standard Joomla! module <em>News Flash</em> (<code>mod_newsflash</code>). With this option you can choose if <em>read less text</em> must always be active on any module output, only active if the contexts below allow this, or never be active on any module output. If the first or the last choice is made, the options <code>Quick Configuration?</code>, <code>Allowed</code> and <code>Disallowed</code> below are ignored for module output."

PLG_CONTENT_READLESSTEXT_NOTES0="Notes"
PLG_CONTENT_READLESSTEXT_NOTES0_DESCRIPTION="This field is not used by <em>read less text</em>. You can use it to write down anything related to <em>read less text</em> and the use of contexts, e.g. why a specific context is added to one of the fields above - when reviewing the options again after several months, this can speed up the time needed to correctly reconfigure them."

PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK="Respect Position<br />Existing <em>Read More</em>"
PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK_DESCRIPTION="Choose what to do when an article already contains a manually inserted <em>Read More</em> link. <ul>You can choose to:<li><strong>Ignore it</strong>: select <code>No</code>.<br />The article will be shortened as if the <em>Read More</em> link was not present.</li><li><strong>Respect it</strong>: select <code>Yes</code>.<br />The text before the <em>Read More</em> link - the <em>intro text</em> - will be used as shortened text: the article will <em>not</em> be shortened using <br/>the length settings above, but at the position of the existing <em>Read More</em> link. The text will be considered shortened - this <br/>'property' is used when determining whether to add a thumbnail, prefix, inline suffix and suffix.</li><li><strong>Use it as an additional upper limit</strong>: select <code>Use it to respect 'Show Intro Text'</code>.<br />If you selected to hide the intro text when displaying an article in full under <code><a href='index.php?option=com_content'>Article Manager</a> &gt; Options &gt; Articles</code> by <br/>setting the option <code>Show Intro Text</code> to <code>Hide</code>, the shortening of the article will be based on the intro text <em>only</em>. <br/>The remainder of the article - the part after the read more token - will then never appear in the shortened text.<br />Normally, the option <code>Show Intro Text</code> will hide the intro text when displaying a single article on a page (provided <br/><em>read less text</em> is not allowed to run on that page). If you select this option, <em>read less text</em> uses the reverse meaning: <br/><em>only</em> the intro text will be considered on all pages where <em>read less text</em> is allowed to run.<br />The text will <em>not</em> be considered shortened if the full intro text is retained - but it will do so, should parts of the intro text be omitted.</li></ul><strong>Note:</strong> This choice does not affect other settings: e.g. the <em>Read More</em> text and styling as configured on this page are still applied, <br/>regardless of this setting.<br /><strong>Note:</strong> Searching for a thumbnail will always be done in the full article, regardless of this setting."
PLG_CONTENT_READLESSTEXT_RETAIN_WHOLE_WORDS="Whole words"
PLG_CONTENT_READLESSTEXT_RETAIN_WHOLE_WORDS_DESCRIPTION="Enable this to retain whole words only. The shortened text may become slightly smaller, to exclude the remainder characters of the word that would otherwise be cut in two. In any case, at least one word of the text will be retained.<br /><strong>Note:</strong> This option only has an effect when <code>character</code> is selected as <code>Length Unit</code>."

PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE="[tokens] To Remove"
PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_DESCRIPTION="Enter a list of <em>comma</em> separated words without [ ] markers, which must be removed in the text. <br /><strong>Note:</strong> When a token is removed due to this option, the article is considered to be shortened. According to the settings in the other sections, a thumbnail, a prefix, inline suffix and/or suffix may be added as a result."
PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_WITH_CONTENTS="[tokens] To Remove<br />With Contents"
PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION="Enter a list of <em>comma</em> separated words without [ ] markers, which must be removed in the text <strong>together with all the text that is present between the opening and the closing token</strong>.<br /><strong>Note:</strong> Self-closing tokens are not supported.<br /><strong>Note:</strong> When a token with its full contents is removed due to this option, the article is considered to be shortened. According to the settings in the other sections, a thumbnail, a prefix, inline suffix and/or suffix may be added as a result.<br /><strong>Example:</strong> If you use the extension plugin <em>EmbedChessboard</em>, you may have added something like <code>[pgn]chess moves[/pgn]</code> to your content article. You can get rid of it in the shortened article by listing <code>pgn</code> here."

PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE="&lt;tags&gt; To Remove"
PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_DESCRIPTION="Enter a list of <em>comma</em> separated HTML tags without &lt; &gt; markers, which must be removed in the text. Leave empty to retain all tags; enter <code>all</code> to remove all formatting.<br /><strong>Example:</strong> Enter <code>a, img</code>, so that links and images are only available when reading the full article.<br /><strong>Note:</strong> Even if <code>img</code> is added in this field, it is still possible to create and display the first valid image as thumbnail in the shortened article.<br /><strong>Note:</strong> The article is <em>not</em> considered to be shortened when a tag is removed due to this option."
PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_WITH_CONTENTS="&lt;tags&gt; To Remove<br />With Contents"
PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION="Enter a list of <em>comma</em> separated HTML tags without &lt; &gt; markers, which must be removed in the text <strong>together with all the html and plain text that is present between the opening and the closing tag</strong>.<br /><strong>Example:</strong> Enter the tag <code>table</code> to entirely remove all tables while displaying the cut-off article text. This is also handy to remove extra styling which you don't want applied in the shortened text.<br />A good choice seems <code>style, nav, menu, footer, script, head, form, noscript</code>.<br /><strong>Note:</strong> When a tag with its full contents is removed due to this option, the article is considered to be shortened. According to the settings in the other sections, a thumbnail, a prefix, inline suffix and/or suffix may be added as a result."
PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE="Tooltip"
PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE_DESCRIPTION="Select here what needs to be used for the thumbnail's title. The title of the thumbnail should be a small piece of text that will be displayed as a tooltip when the mouse is hovered over the image.<br /><strong>Note:</strong> It is not possible to display HTML formatted text in a tooltip. The text shown as tooltip will be unformatted, i.e. with all HTML tags removed."
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_COLOR="Border Color"
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_COLOR_DESCRIPTION="The color of the border around the moved and resized first image. You can enter a color here in any format CSS understands.<br /><strong>Note:</strong> Leave empty to restore the default value.<br /><strong>Note:</strong> Set <code>Border Width</code> to <code>-1</code> to not restyle the image in this respect."
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_STYLE="Border Style"
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_STYLE_DESCRIPTION="The style of the border around the moved and resized thumbnail. Choose <code>None</code> to not restyle the image in this respect."
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_WIDTH="Border Width"
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_WIDTH_DESCRIPTION="The width in pixels of the border around the moved and resized first image. Enter <code>-1</code> to not restyle the image in this respect."
PLG_CONTENT_READLESSTEXT_THUMB_CACHE_TIME="Cache Time"
PLG_CONTENT_READLESSTEXT_THUMB_CACHE_TIME_DESCRIPTION="Enter a number. This sets the caching time of any generated thumbnail to the given number, in seconds. You will still need to use the built-in functionality Joomla! provides to clear expired cached thumbnails (<code>Site &gt; Maintenance &gt; Purge Expired Cache</code>).<br /><strong>Note:</strong> Caching of thumbnails can not be disabled."
PLG_CONTENT_READLESSTEXT_THUMB_CLASS="Thumbnail Class"
PLG_CONTENT_READLESSTEXT_THUMB_CLASS_DESCRIPTION="Using the options above, some basic formatting can be applied. For full freedom and flexibility, you can also style the image with any CSS class.<br /><strong>Note:</strong> Choices made above prevail to the formatting that comes along the given CSS class."
PLG_CONTENT_READLESSTEXT_THUMB_HEIGHT="Thumbnail Height"
PLG_CONTENT_READLESSTEXT_THUMB_HEIGHT_DESCRIPTION="Enter a number. This will be the desired thumbnail height, expressed in pixels.<br />The first image that meets all conditions is resized while respecting the ratio of the original image, such that the thumbnail fits in the given width and height dimensions.<br /><strong>Note:</strong> Enter 0 to not impose a limit on the height."
PLG_CONTENT_READLESSTEXT_THUMB_MARGIN="Margin"
PLG_CONTENT_READLESSTEXT_THUMB_MARGIN_DESCRIPTION="<dl>The margin to set around the thumbnail. There are four ways to set the margin, and each way provides a different <br/>number of margins:<dt><strong>1 number</strong></dt><dd>The given margin is set all around the image.</dd><dt><strong>2 numbers</strong></dt><dd>The first number is used to set the margin above and below the image,<br />the second number is used to set the margin to the left and to the right of the image.</dd><dt><strong>3 numbers</strong></dt><dd>The first is used to set the margin above the image,<br />the second is used to the set the margin to the left and to the right of the image,<br />the third below the image.</dd><dt><strong>4 numbers</strong></dt><dd>The numbers are each used to set one margin of the image, going clockwise around the image, starting from above: <br/>above the image, to the right of, below and to the left of the image.</dd></dl><strong>Note:</strong> If no unit is given, the number is assumed to be expressed in pixels.<br /><strong>Note:</strong> Enter <code>-1</code> to not restyle the image in this respect.<br /><strong>Example:</strong> <code>6</code><br />sets a margin of 6 pixels all around the image.<br /><strong>Example:</strong> <code>0px 10px 10 0</code><br />seems suitable when the thumbnail is positioned in the upper left portion of the article, since there will be only a <br/>margin of 10 pixels below and to the right of the image.<br /><strong>Example:</strong> <code>4 4 1em</code><br />sets a margin of 4 pixels all around the image, except below, where a margin of 1 <em>em</em> is used."
PLG_CONTENT_READLESSTEXT_THUMB_PADDING="Padding"
PLG_CONTENT_READLESSTEXT_THUMB_PADDING_DESCRIPTION="The padding to set around the thumbnail.<br /><strong>Note:</strong> Enter <code>-1</code> to not restyle the image in this respect."
PLG_CONTENT_READLESSTEXT_THUMB_POSITION="Thumbnail Position"
PLG_CONTENT_READLESSTEXT_THUMB_POSITION_DESCRIPTION="The thumbnail will be placed on the given position, with the text flowing around the image."
PLG_CONTENT_READLESSTEXT_THUMB_WIDTH="Thumbnail Width"
PLG_CONTENT_READLESSTEXT_THUMB_WIDTH_DESCRIPTION="Enter a number. This will be the desired thumbnail width, expressed in pixels.<br />The first image that meets all conditions is resized while respecting the ratio of the original image, such that the thumbnail fits in the given width and height dimensions.<br /><strong>Note:</strong> Enter 0 to not impose a limit on the width."
PLG_CONTENT_READLESSTEXT_TRANSLATE_ADDITIONS="Enable Multi-language<br />support?"
PLG_CONTENT_READLESSTEXT_TRANSLATE_ADDITIONS_DESCRIPTION="Choose here whether multi-language support must be enabled. This means that all field values you can enter on this configuration page, and which can get displayed to your users, will automatically get translated to the language of your visitor.<ul>If you select <code>Yes</code> here, the affected fields are:<li><code>Prefix For Registered Users (and higher)</code></li><li><code>Prefix For Guests</code></li><li><code>Suffix For Registered Users (and higher)</code></li><li><code>Inline Suffix For Registered Users (and higher)</code></li><li><code>Suffix For Guests</code></li><li><code>Inline Suffix For Guests</code></li></ul> If this option is enabled, these fields <strong>must not</strong> contain the actual pre- or suffix text, but a placeholder, which <strong>must be</strong> written using  <em>only</em> capital letters and the underscore <code>_</code>. <strong>The full prefix or suffix including all HTML tags surrounding it must then be replaced with that placeholder word, and the entire field may only contain that one word.</strong> Examples of correct placeholders are <code>ABCDEFG</code>, <code>MY_PREFIX</code> or <code>MY_TO_BE_TRANSLATED_TEXT</code>.<br /><br />Then, you must use Joomla's language override feature to enter the proper translations <em>for each language your site supports</em>, and for each placeholder you entered for one of the affected fields. <ul>You can do that by going to <em>Extensions > Language Manager > Overrides</em>:<li>First select the language for which you want to add a new override using the dropdown box on the right,</li><li>then click <code>New</code>.</li><li>Use the placeholder as the value for <code>Language Constant</code>,</li><li>and for <code>Text</code> your translated, real pre- or suffix value, <em>together with all the HTML tags</em> that were originally present in the corresponding field on this configuration page. You can still provide all the available tokens, such as <code>{title}</code> and <code>{words}</code>.</li></ul><strong>Note:</strong> It is important to make the name long and distinctive enough to be unique among all translation strings on your entire site: if you decide to use a placeholder that is already in use on some other part of your site, that part will receive your new translation too.<br />As a trivial example: do not use <code>MOD_BREADCRUMBS_HERE</code> as a placeholder while configuring <em>read less text</em>."

PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX="Inline suffix For <br />Registered Users <br />(and higher)"
PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_DESCRIPTION="<strong>For registered users only.</strong> Enter here the text to add right after the last character of the article, before closing all tags. <br/>You can provide HTML code here.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Note:</strong> The default suffix just appends three dots. To reload the default value, just clear the text field and save the configuration.<br/><strong>Note:</strong> If the option <code>Enable Multi-language support?</code> is enabled, all text, including the HTML code, must be replaced <br/>with a placeholder; a placeholder is <strong>one</strong> word that must be used to define the real prefix - per language - under the <br/><em>Language Manager</em>."
PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE="User inline suffix links to<br />full article"
PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="If this option is enabled the inline suffix (text or HTML) will be wrapped and given as a link: when clicked, the user is directed to the full article.<br />If this option is disabled, you will have to provide another means for the user to access the full article: by linking the title, by ensuring a thumbnail is generated, or by providing the desired HTML code yourself in the suffix. In the latter case, you can use the <code>{url}</code> token in combination with HTML tag <code>a</code>."
PLG_CONTENT_READLESSTEXT_USER_PREFIX="Prefix For Registered<br />Users (and higher)"
PLG_CONTENT_READLESSTEXT_USER_PREFIX_DESCRIPTION="<strong>For registered users only.</strong> Enter here the text to add before the article. <br/>You can provide HTML code here.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><br /><strong>Note:</strong> Leave empty to not prepend the article.<br/><strong>Note:</strong> If the option <code>Enable Multi-language support?</code> is enabled, all text, including the HTML code, must be replaced <br/>with a placeholder; a placeholder is <strong>one</strong> word that must be used to define the real prefix - per language - under the <em>Language Manager</em>."
PLG_CONTENT_READLESSTEXT_USER_PREFIX_LINKS_TO_FULL_ARTICLE="User prefix links to<br />full article"
PLG_CONTENT_READLESSTEXT_USER_PREFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="If this option is enabled the prefix (text or HTML) will be wrapped and given as a link: when clicked, the user is directed to the full article.<br />If this option is disabled, you will have to provide another means for the user to access the full article: by linking the title, by ensuring a thumbnail is generated, or by providing the desired HTML code yourself in the suffix. In the latter case, you can use the <code>{url}</code> token in combination with HTML tag <code>a</code>."
PLG_CONTENT_READLESSTEXT_USER_SUFFIX="Suffix For <br />Registered Users <br />(and higher)"
PLG_CONTENT_READLESSTEXT_USER_SUFFIX_DESCRIPTION="<strong>For registered users only.</strong> Enter here the text to add after the article. This value replaces the default <em>Read More</em> text. <br/>You can provide HTML code here.<ul>The following tokens are recognized and replaced for each article:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Note:</strong> The default suffix mimics the standard <em>Read more</em> code Joomla! provides. To reload the default value, just clear <br/>the text field and save the configuration.<br/><strong>Note:</strong> If the option <code>Enable Multi-language support?</code> is enabled, all text, including the HTML code, must be replaced with <br/>a placeholder; a placeholder is <strong>one</strong> word that must be used to define the real prefix - per language - under the <br/><em>Language Manager</em>."
PLG_CONTENT_READLESSTEXT_USER_SUFFIX_LINKS_TO_FULL_ARTICLE="User suffix links to<br />full article"
PLG_CONTENT_READLESSTEXT_USER_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="If this option is enabled the suffix (text or HTML) will be wrapped and given as a link: when clicked, the user is directed to the full article.<br />If this option is disabled, you will have to provide another means for the user to access the full article: by linking the title, by ensuring a thumbnail is generated, or by providing the desired HTML code yourself in the suffix. In the latter case, you can use the <code>{url}</code> token in combination with HTML tag <code>a</code>. <br /><strong>Note:</strong> The default suffix mimics the standard <em>Read more</em> code Joomla! provides and already includes the <code>{url}</code> token in combination with the correct HTML tags: this option is best turned off in that case."

PLG_CONTENT_READLESSTEXT_WHEN="Quick Configuration?"
PLG_CONTENT_READLESSTEXT_WHEN_DESCRIPTION="Either use the quick configuration, which is assumed to suit most users, either decline it and use the full flexibility <em>read less text</em> offers."
PLG_CONTENT_READLESSTEXT_WRAPPER_CLASS="Wrapper Class"
PLG_CONTENT_READLESSTEXT_WRAPPER_CLASS_DESCRIPTION="Enter here one or more class names. These will be assigned to the selected wrapper tag."
PLG_CONTENT_READLESSTEXT_WRAPPER_TAG="Wrapper Tag"
PLG_CONTENT_READLESSTEXT_WRAPPER_TAG_DESCRIPTION="<br />Select the tag which must encapulate each shortened article. Using this tag and the corresponding <code>Wrapper Class</code> below, you have full flexibility in further enhancing the format of your articles.<br /><strong>Note:</strong> select <code>No</code> to disable this option.<br /><strong>Note:</strong> If a tag is selected, the article will be wrapped each time <em>read less text</em> may active."

; Option choices for
; - PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX,
; - PLG_CONTENT_READLESSTEXT_ADD_PREFIX,
; - PLG_CONTENT_READLESSTEXT_ADD_SUFFIX,
; - PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING and
; - PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL.
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE="Always when read less text may be active"
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_LONG_ENOUGH="Always when active and the article is long enough"
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_SHORTENED="Only when the article is shortened"
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_USE_ARTICLE_MANAGER_OPTION="Respect global option Show 'Read More'"

; Option choices for PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE
PLG_CONTENT_READLESSTEXT_SCOPE_ACCORDING_TO_CONTEXTS="Respecting options below"
PLG_CONTENT_READLESSTEXT_SCOPE_ALWAYS="Always, regardless options below"
PLG_CONTENT_READLESSTEXT_SCOPE_NEVER="Never, regardless options below"

; Option choices for
; - PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION and/or
; - PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION.
PLG_CONTENT_READLESSTEXT_CROP_BOTTOM="Retain the bottom, cut off the top"
PLG_CONTENT_READLESSTEXT_CROP_CENTER="Cut off evenly on both sides"
PLG_CONTENT_READLESSTEXT_CROP_FULL_HEIGHT="Do not crop. Retain the full height."
PLG_CONTENT_READLESSTEXT_CROP_FULL_WIDTH="Do not crop. Retain the full width."
PLG_CONTENT_READLESSTEXT_CROP_LEFT="Retain the left side, cut off on the right"
PLG_CONTENT_READLESSTEXT_CROP_RIGHT="Retain the right side, cut off on the left"
PLG_CONTENT_READLESSTEXT_CROP_TOP="Retain the top, cut off the bottom"

; Option choices for PLG_CONTENT_READLESSTEXT_LENGTH_UNIT
PLG_CONTENT_READLESSTEXT_CHAR="character"
PLG_CONTENT_READLESSTEXT_PARAGRAPH="paragraph"
PLG_CONTENT_READLESSTEXT_SENTENCE="sentence"
PLG_CONTENT_READLESSTEXT_WORD="word"

; Option choices for PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK
PLG_CONTENT_READLESSTEXT_RESPECT_SHOWINTRO="Use it to respect 'Show Intro Text'"

; Option choices for PLG_CONTENT_READLESSTEXT_THUMB_POSITION
PLG_CONTENT_READLESSTEXT_UPPER_LEFT="Upper Left"
PLG_CONTENT_READLESSTEXT_UPPER_RIGHT="Upper Right"

; Option choices for PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE
PLG_CONTENT_READLESSTEXT_ARTICLE_TITLE_AS_THUMBNAIL_TITLE="Article title"
PLG_CONTENT_READLESSTEXT_INLINE_SUFFIX_AS_THUMBNAIL_TITLE="Article inline suffix"
PLG_CONTENT_READLESSTEXT_NO_THUMBNAIL_TITLE="None"
PLG_CONTENT_READLESSTEXT_PREFIX_AS_THUMBNAIL_TITLE="Article prefix"
PLG_CONTENT_READLESSTEXT_SUFFIX_AS_THUMBNAIL_TITLE="Article suffix"

; Option choices for PLG_CONTENT_READLESSTEXT_WHEN
PLG_CONTENT_READLESSTEXT_COMMON_USAGE="Yes, active on all content blog pages"
PLG_CONTENT_READLESSTEXT_SPECIFIC_USAGE="No, use the fields below"
PK�j&]��T���Breadlesstext/language/nl-NL/nl-NL.plg_content_readlesstext.sys.ininu�[���; site language file for read less text
; Copyright Copyright (C) 2010-2013 parvus
; license GNU/GPL_GPLv3 http://www.gnu.org/copyleft/gpl.html
;
; This file is part of the Joomla! extension plugin read less text.
;
; read less text 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.
;
; read less text 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
; read less text. If not, see <http://www.gnu.org/licenses/>.
;
; @version $Id: nl-NL.plg_content_readlesstext.sys.ini 271 2014-11-25 19:55:07Z parvus $
PLG_CONTENT_READLESSTEXT_DESCRIPTION="<h2>v5.2 (r274)</h2><p><em>read less text</em> is een krachtiger alternatief voor de bestaande <em>Lees meer</em> functionaliteit. Automatisch afkorten, volledige controle over het selectief behoud van opmaak, en het automatisch aanmaken van het juiste pictogram die de begintekst in het oog doet springen; dit alles op precies die pagina's die u opgeeft. <em>read less text</em> maakt geen wijzigingen in de database en komt alleen tussenbeide bij de opbouw van de pagina: deïnstalleer de extensie of schakel hem uit om alle effecten ongedaan te maken.</p><p>De uitgebreide tooltips helpen u de uitgebreide instellingen naar uw hand te zetten om <a href='index.php?option=com_plugins&view=plugins&filter_search=read'><em>read less text</em></a> te laten integreren op uw site. Activeer de mode <em>Ontdekken</em> om de volledige flexibiliteit uit te buiten.</p><p>Deze versie laat de titels ongemoeid. Indien u ook te lange titels wil afkorten, specifieke informatie voor- of achteraan de titel wil toevoegen of het gebruik van hoofdletters wil onderdrukken, kan u terecht bij de afzonderlijke extensie <a href='http://extensions.joomla.org/extensions/style-a-design/titles/16619/'>read less title.</a></p>"
PK�j&]܍4<��>readlesstext/language/nl-NL/nl-NL.plg_content_readlesstext.ininu�[���; site language file for read less text
; Copyright Copyright (C) 2010-2014 parvus
; license GNU/GPL_GPLv3 http://www.gnu.org/copyleft/gpl.html
;
; This file is part of the Joomla! extension plugin read less text.
;
; read less text 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.
;
; read less text 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
; read less text. If not, see <http://www.gnu.org/licenses/>.
;
; @version $Id: nl-NL.plg_content_readlesstext.ini 213 2012-12-04 19:15:47Z parvus $

; Help
PLG_CONTENT_READLESSTEXT_DESCRIPTION="<h2>v5.2 (r274)</h2><p><em>read less text</em> is een krachtiger alternatief voor de bestaande <em>Lees meer</em> functionaliteit. Automatisch afkorten, volledige controle over het selectief behoud van opmaak, en het automatisch aanmaken van het juiste pictogram die de begintekst in het oog doet springen; dit alles op precies die pagina's die u opgeeft. <em>read less text</em> maakt geen wijzigingen in de artikel tabellen en komt alleen tussenbeide bij de opbouw van de pagina: deïnstalleer de extensie of schakel hem uit om alle effecten ongedaan te maken.</p><p><em>Het is ten zeerste aangeraden om de mode <code>Ontdekken</code> in te schakelen indien u een zeer specifieke configuratie wenst: hiermee kan u precies bepalen wanneer read less text tussenbeide mag komen. U kan deze mode in- en uitschakelen in de sectie <code>Wanneer Actief</code>.</em></p><p>Deze versie laat de titels ongemoeid. Indien u ook te lange titels wil afkorten, specifieke informatie voor- of achteraan de titel wil toevoegen of het gebruik van hoofdletters wil onderdrukken, kan u terecht bij de afzonderlijke extensie <a href='http://extensions.joomla.org/extensions/style-a-design/titles/16619/'>read less title.</a></p> <h2>Context - Snel</h2> <p>Een snelle configuratie kan u uit onderstaande tabel halen: <table><tr><th><code>Wanneer</code> &gt; <code>Actief</code></th> <th><em>alleen</em> actief op</th></tr> <tr><td><code>frontpage</code></td> <td>de voorpagina van deze site</td></tr> <tr><td><code>category</code></td> <td>alle artikel blog pagina's</td></tr> <tr><td><br /><code>category=12</code></td> <td>de blog pagina van<br />de categorie met id 12</td></tr> <tr><td><code>135</code></td> <td>Het artikel met id 135 <br /> op elke blog en artikel pagina</td></tr> </table></p> <ul><li>De meeste gebruikers zullen <em>read less text</em> willen activeren voor alle artikel blog pagina's. Zij kunnen kiezen voor de <code>Standaard Instelling</code>: de velden <code>Actief</code> en <code>Inactief</code> worden dan genegeerd.</li>  <li><em>read less text</em> kan niet geactiveerd worden op een lijst pagina - dit is een technische beperking.</li> <li><em>read less text</em> kan ook werkzaam zijn op <em>items</em> van andere componenten - dit hangt volledig af van de aard en implementatie van die component.</li></ul> <h2>Tokens</h2> <p><em>read less text</em> kan zowel vooraan als achteraan een opgegeven tekst toevoegen.</p> <p>Zowel de prefix als de suffix kunnen <em>tokens</em> bevatten. Een <em>token</em> is een speciaal codewoord, omringd door accolades. <ul>U kan de volgende codewoorden gebruiken: <li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul></p> <p>De opgegeven <em>tokens</em> worden telkens opnieuw vervangen voor elk artikel. Tokens die vervangen worden door een datum worden opgemaakt volgens de optie <code>Formaat Datums</code>. U kan de verschillende mogelijke codes and hun betekenis opzoeken in de PHP handleiding bij <a href='http://php.net/manual/en/function.date.php'>de functie <code>date</code></a>.</p> <h2>Context - Traag</h2> <p> <ul>U kan zeer precies aangeven voor welke pagina's deze plugin actief mag zijn en wanneer niet. U voegt hiervoor een zogenaamde <em>context</em> toe aan het veld <code>Actief</code> of <code>Inactief</code>. Een <em>context</em> is eenvoudigweg een combinatie van de naam van een component, de naam van een <em>view</em> en een artikel of <em>item</em> id, van elkaar gescheiden door een dubbele punt. <li>De component mag achterwege gelaten worden - in dat geval wordt verondersteld dat het over <code>com_content</code> gaat.</li> <li>De <em>view</em> mag achterwege gelaten worden - in dat geval wordt verondersteld dat elke <em>view</em> van de aangegeven component bedoeld wordt.</li> <li>Het artikel of <em>item</em> mag achterwege gelaten worden - in dat geval wordt verondersteld dat elk artikel of <em>item</em> op de aangegeven <em>view</em>s bedoeld wordt.</li> <li>Het laatste gedeelte, waar u een artikel id kan opgeven, bevat één speciaal codewoord: <code>all-in-&lt;n&gt;</code>, waarbij <code>&lt;n&gt;</code> vervangen dient te worden door het id van een categorie. Hiermee worden alle artikels in de opgegeven categorie <code>&lt;n&gt;</code> aangeduid.</li> </ul></p> <p>De bovenstaande tabel gaf al enkele eenvoudige voorbeelden. Een fijnere granulariteit is beschikbaar indien u deze nodig heeft.</p> <h2>Context - Ontdekken</h2> <p>Om te ontdekken of <em>read less text</em> actief kan zijn op een specifieke pagina, en hoe de configuratie dan gemaakt wordt, kan u de mode <code>Ontdekken</code> aanzetten. In deze mode zal <em>read less text</em> - waar mogelijk - de tekst van elk artikel of <em>item</em> vervangen door de informatie die u nodig heeft om de configuratie na te kijken en aan te passen naar uw wensen.</p> <p>De mode <code>Ontdekken</code> wordt alleen gebruikt voor gebruikers die zijn aangemeld en toegang hebben tot het back-end gedeelte van uw site. Deze optie kan u dus gerust activeren, zonder dat de bezoekers van uw site er iets van merken.</p> <h2>Contexts - Nog twee voorbeelden</h2> <p>Veronderstel de volgende configuratie:</p> <table><tr><th>Optie</th> <th>Waarde</th></tr> <tr><td><code>Standaard Instelling</code></td> <td><code>Nee, gebruik de velden hieronder</code></td></tr> <tr><td><code>Actief</code></td> <td><code>frontpage, category, com_eventlist:venues</code></td></tr> <tr><td><code>Inactief</code></td> <td><code>38, 245, 246, category=7, com_eventlist:venues:28</code></td></tr></table></p> <p> <ul>In dit geval zal <em>read less text</em>: <li>Nooit actief zijn voor de artikels met id 38, 245 and 246, ongeacht waar ze getoond worden.</li> <li>Niet actief zijn wanneer de artikels van de categorie 7 getoond worden in een blog pagina.</li> <li>Actief zijn voor alle andere artikels op alle andere blog pagina's, inclusief (alleen voor Joomla! 1.6) een categorie blog pagina binnen categorie 7.</li> <li>Actief zijn op de voorpagina, behalve voor de artikels met id 38, 245 en 246.</li> <li>Actief zijn op elke locatie lijst pagina's van EventList (<em>Categoryevents</em>), voor alle locaties behalve de locatie met id 28 </ul></p> <p>Veronderstel de volgende configuratie:</p> <table><tr><th>Optie</th> <th>Waarde</th></tr> <tr><td><code>Beperk Toegang Voor Gasten</code></td> <td><code>Ja</code></td></tr> <tr><td><code>Standaard Instelling</code></td> <td><code>Nee, gebruik de velden hieronder</code></td></tr> <tr><td><code>Actief</code></td> <td><code>blog, categories, category, featured</code></td></tr> <tr><td><code>Inactief</code></td> <td><code>all-in-7</code></td></tr></table></p> <p> <ul>In dit geval zal <em>read less text</em>:<li>Actief zijn op alle blog pagina's van <code>com_content</code> wanneer een gebruiker is aangemeld,</li> <li>altijd actief zijn voor alle artikels van <code>com_content</code> op alle pagina's wanneer een gebruiker <em>niet</em> is aangemeld (m.a.w. als een gast uw site bezoekt),</li> <li><em>behalve</em> voor de artikels die tot categorie <code>7</code> behoren, die <em>read less text</em> nooit zal proberen af te korten, ongeacht de pagina waar ze getoond worden.</li></ul></p> <hr/> <h2>Dank u wel!</h2> <ul>U kan uw eventuele waardering op verschillende manieren laten blijken: <li>Door <a href='http://joomlacode.org/gf/project/cutoff/tracker/?action=TrackerItemBrowse&tracker_id=9352'>fouten te rapporteren</a> of <a href='http://joomlacode.org/gf/project/cutoff/tracker/?action=TrackerItemBrowse&tracker_id=9351'>nieuwe functionaliteit aan te vragen</a>: zowel uw als mijn tijd zijn beperkt, en wat niet aangecraagd wordt, wordt waarschijnlijk ook niet opgelost of toegevoegd.</li><li>Door <a href='http://extensions.joomla.org/extensions/news-display/article-elements/articles-summary/12432'>een score te geven aan deze extensie</a> en een correcte gebruikerservaring toe te voegen: zowel de hoogte van de score en toon van de commentaren spelen in grote mate mee om nieuwe gebruikers te overtuigen deze extensie uit te proberen.</li><li>Door <a href='https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=L9P4GMDWRKGUN'>een donatie over te maken (PayPal)</a>: elke gift is waardevol en wordt dankbaar aanvaard; het geeft een enorme motivatie!</li></ul>"

; Sections
COM_PLUGINS_FORMATTING_FIELDSET_LABEL="Opmaak"
COM_PLUGINS_INFO_FIELDSET_LABEL="Informatie"
COM_PLUGINS_LENGTH_FIELDSET_LABEL="Lengte"
COM_PLUGINS_PREFIX_FIELDSET_LABEL="Prefix"
COM_PLUGINS_SUFFIX_FIELDSET_LABEL="Lees Meer (Suffix)"
COM_PLUGINS_THUMBNAIL_FIELDSET_LABEL="Pictogram"
COM_PLUGINS_WHEN-ACTIVE_FIELDSET_LABEL="Wanneer Actief"

; Options
PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX="Voeg Aansluitende Suffix toe"
PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX_DESCRIPTION="Zelf gekozen tekst kan worden toegevoegd achter het (al dan niet) afgekorte artikel. De velden hieronder geven aan wat er toegevoegd moet worden <em>voordat</em> alle tags gesloten zijn. Dit betekent dat de tekst hieronder ingesteld tegen het laatste woord van het artikel wordt geplaatst, binnen dezelfde paragraaf, en met dezelfde opmaak.<br />Geef hier aan wanneer de hierna volgende opties toegepast mogen worden. <li>Kies <code>Nee</code> om de opties niet toe te passen.</li> <li>Kies <code>Altijd wanneer read less text actief mag zijn</code> om alle opties toe te passen wanneer de filters zoals ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten. De opties hieronder zullen dan worden toegepast, ongeacht de lengte van het artikel, en of het artikel nu afgekort wordt of niet.</li> <li><Kies <code>Respecteer de algemene optie 'Lees meer' Tonen</code> om alle opties toe te passen wanneer <em>read less text</em> actief mag zijn, én de voornoemde optie in <em>Artikelbeheer</em> dit toelaat.</li><li>Kies <code>Altijd wanneer actief en het artikel lang genoeg is</code> om alle opties hieronder toe te passen wanneer zowel de filters ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten; én het artikel werd afgekort, ofwel door de opties <code>Lengte Afgekorte Tekst</code> en <code>Behoud Positie Bestaande Lees Meer Link</code>, ofwel door het verwijderen van tags of tokens zoals ingesteld in de sectie <em>Opmaak</em>.</li></ul>"

PLG_CONTENT_READLESSTEXT_ADD_PREFIX="Voeg Prefix toe"
PLG_CONTENT_READLESSTEXT_ADD_PREFIX_DESCRIPTION="<ul>Geef hier aan wanneer alle opties hieronder in deze sectie toegepast mogen worden. <li>Kies <code>Nee</code> om de opties in deze <em>Voeg Prefix &amp; Suffix toe</em> sectie niet toe te passen.</li> <li>Kies <code>Altijd wanneer read less text actief mag zijn</code> om alle opties toe te passen wanneer de filters zoals ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten. De opties hieronder zullen dan worden toegepast, ongeacht de lengte van het artikel, en of het artikel nu afgekort wordt of niet.</li> <li>Kies <code>Altijd wanneer actief en het artikel lang genoeg is</code> om alle opties hieronder toe te passen wanneer zowel de filters ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten; én het artikel werd afgekort, ofwel door de opties <code>Lengte Afgekorte Tekst</code> en <code>Behoud Positie Bestaande Lees Meer Link</code>, ofwel door het verwijderen van tags of tokens zoals ingesteld in de sectie <em>Opmaak</em>.</li></ul>"

PLG_CONTENT_READLESSTEXT_ADD_SUFFIX="Voeg Lees Meer (Suffix) toe"
PLG_CONTENT_READLESSTEXT_ADD_SUFFIX_DESCRIPTION="<ul>Zelf gekozen tekst kan worden toegevoegd achter het (al dan niet) afgekorte artikel. De velden hieronder geven aan wat er toegevoegd moet worden <em>nadat</em> alle tags gesloten zijn. Dit betekent dat de tekst hieronder ingesteld onder het artikel wordt geplaatst, buiten de paragraaf.<br />Geef hier aan wanneer de hierna volgende opties toegepast mogen worden. <li>Kies <code>Nee</code> om de opties niet toe te passen.</li> <li>Kies <code>Altijd wanneer read less text actief mag zijn</code> om alle opties toe te passen wanneer de filters zoals ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten. De opties hieronder zullen dan worden toegepast, ongeacht de lengte van het artikel, en of het artikel nu afgekort wordt of niet.</li> <li><Kies <code>Respecteer de algemene optie 'Lees meer' Tonen</code> om alle opties toe te passen wanneer <em>read less text</em> actief mag zijn, én de voornoemde optie in <em>Artikelbeheer</em> dit toelaat.</li><li>Kies <code>Altijd wanneer actief en het artikel lang genoeg is</code> om alle opties hieronder toe te passen wanneer zowel de filters ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten; én het artikel werd afgekort, ofwel door de opties <code>Lengte Afgekorte Tekst</code> en <code>Behoud Positie Bestaande Lees Meer Link</code>, ofwel door het verwijderen van tags of tokens zoals ingesteld in de sectie <em>Opmaak</em>.</li></ul>"

PLG_CONTENT_READLESSTEXT_ALLOWED="Actief"
PLG_CONTENT_READLESSTEXT_ALLOWED_DESCRIPTION="Geef hier een lijst van <em>context</em>en, gescheiden door een <em>komma</em>. Kijk de uitleg hierlangs na voor een volledig overzicht. Indien dit veld niet leeg is, zal de plugin <em>alleen</em> actief zijn op artikels of <em>items</em> in de hier opgegeven contexten. Indien dit veld leeg is, wordt er geen beperking ingesteld. <strong>Met de mode <code>Ontdekken</code> actief, wordt de meest specifieke context voor elke artikel of <em>item</em> getoond.</strong>"

PLG_CONTENT_READLESSTEXT_ALWAYS_ACTIVE_FOR_GUESTS="Beperk Toegang<br />Voor Gasten"
PLG_CONTENT_READLESSTEXT_ALWAYS_ACTIVE_FOR_GUESTS_DESCRIPTION="Met deze instelling voorkomt u dat gasten de volledige tekst van het artikel of <em>Item</em> kunnen lezen: alleen bezoekers die zijn aangemeld krijgen de volledige tekst te zien. Indien deze optie actief is, wordt de optie <code>Actief</code> uitgebreid met <code>, com_content</code> indien een niet-aangemelde bezoeker een pagina opvraagt: <em>read less text</em> zal dan altijd actief zijn voor alle artikels in <code>com_content</code>, behalve voor de <em>context</em>en vermeld in <code>Inactief</code>.<br/><strong>Opmerking:</strong>Als de toegang beperkt wordt, kijk dan zeker ook de opties na die een link geven naar het volledige artikel: <code>Prefix Voor Gasten</code> onder <code>Prefix</code> en/of <code>Suffix Voor Gasten</code> onder <code>Lees Meer (Suffix)</code> - indien de bijhorende optie <code>Maak Link Van ...</code> is geactiveerd. Daar kan u er dan voor zorgen dat de gasten worden doorgestuurd naar een pagina waar ze kunnen aanmelden of zich kunnen inschrijven om het volledige artikel te lezen."

PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING="Verwijder niet gewenste<br /><em>tags</em> and <em>tokens</em>"
PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING_DESCRIPTION="<ul>Geef hier aan wanneer alle opties hieronder in deze sectie toegepast mogen worden. <li>Kies <code>Nee</code> om de opties in deze <em>Opmaak</em> sectie niet toe te passen.</li> <li>Kies <code>Altijd wanneer read less text actief mag zijn</code> om alle opties toe te passen wanneer de filters zoals ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten. De opties hieronder zullen dan worden toegepast, ongeacht de lengte van het artikel, en of het artikel nu afgekort wordt of niet.</li> <li>Kies <code>Altijd wanneer actief en het artikel lang genoeg is</code> om alle opties hieronder toe te passen wanneer zowel de filters ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten; én het artikel <em>lang genoeg</em> is, zoals bepaald door de opties <code>Minimum Lengte Tekst</code> en <code>Behoud Positie Bestaande Lees Meer Link</code>.</li></ul>"

PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SHORTEN_COUNT="Aantal af te korten artikels"
PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SHORTEN_COUNT_DESCRIPTION="Geef hier een getal in. <em>read less text</em> zal op elke webpagina alleen dit aantal artikels of <em>items</em> bekijken om af te korten, <em>na</em> het overslaan van het bovenstaande aantal artikels of items.<br />Geef hier <code>0</code> in om alle overblijvende artikels of items af te korten.<br/><strong>Opmerking:</strong> Zelfs wanneer an artikel niet overgeslagen mag worden, kan het gebeuren dat het artikel niet afgekort wordt. Dit indien het artikel of item niet lang genoeg is (kijk hiervoor de optie <code>Lengte</code> &gt; <code>Minimum Lengte Tekst</code> na) of door de <em>context</em> (kijk hiervoor de opties  <code>Standaard Instelling?</code>, <code>Actief</code> and <code>Inactief</code> hieronder na)."

PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SKIP_COUNT="Aantal over te slaan artikels"
PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SKIP_COUNT_DESCRIPTION="Geef hier een getal in. De eerste zoveel artikels of <em>Items</em> die op een pagina getoond gaan worden, zullen door <em>read less text</em> niet behandeld worden.<br/><strong>Opmerking:</strong> Zelfs als een artikel of <em>Item</em> niet overgeslagen mag worden, kan het zijn dat het artikel niet wordt afgekort: het kan zijn dat de tekst niet lang genmoeg is (zie hiervoor de optie <code>Lengte</code> &gt; <code>Minimum Lengte Tekst</code>), of dat de context hetr niet toeliet (zie hiervoor de opties <code>Standaard Instelling?</code>, <code>Actief</code> en <code>Inactief</code> hieronder).<br /><strong>Opmerking:</strong> Geef hier <code>0</code> in om geen artikels over te slaan."

PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE="In component scope"
PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE_DESCRIPTION="Met deze optie en de optie hieronder kan u het gebruik van <em>read less text</em> verder beperken. Tijdens de opbouw van een pagina kan een comnponent - niet alleen <code>com_content</code> - tekst van artikels tonen. In de meeste gevallen laat deze component ook de tussenkomst toe van <em>read less text</em> (technisch: het event <code>nContentBeforeDisplay</code> wordt gegenereerd). Voorbeelden zijn <em>Eventlist</em> (<code>com_eventlist</code>) en <em>FJ Related Articles Blog and List Component</em> (<code>com_fjrelated</code>).<br />Met deze optie kan u er voor kiezen of <em>read less text</em> de context regels moet volgen zoals hieronder ingesteld, of nooit actief mag zijn op de output van een conponent. Als de laatste keuze wordt gemaakt, worden de opties <code>Standaard Instelling?</code>, <code>Actief</code> en <code>Inactief</code> genegeerd voor alle output van elke component."

PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL="Genereer Pictogram"
PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL_DESCRIPTION="<ul><em>Read Less Text</em> kan in de tekst van het <em>volledige</em> artikel zoeken naar een afbeelding die voldoet aan alle opgelegde voorwaarden, deze herschalen en vooraan de afgekorte tekst als pictogram invoegen. <li>Kies <code>Nee</code> om de opties in deze <em>Genereer Pictogram</em> sectie niet toe te passen.</li> <li>Kies <code>Altijd wanneer read less text actief mag zijn</code> om alle opties toe te passen wanneer de filters zoals ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten. De opties hieronder zullen dan worden toegepast, ongeacht de lengte van het artikel, en of het artikel nu afgekort wordt of niet.</li> <li>Kies <code>Altijd wanneer actief en het artikel lang genoeg is</code> om alle opties hieronder toe te passen wanneer zowel de filters ingesteld in de sectie <em>Wanneer Actief</em> dit toelaten; én het artikel werd afgekort, ofwel door de opties <code>Minimum Lengte Tekst</code> en <code>Behoud Positie Bestaande Lees Meer Link</code>, ofwel door het verwijderen van tags of tokens zoals ingesteld in de sectie <em>Opmaak</em>.</li></ul><strong>Opmerking:</strong> Elke afbeelding die niet aan alle voorwaarden voldoet blijft in de tekst staan. Indien u in de afgekorte tekst geen enkele afbeelding wil zien behalve het uitgekozen pictogram, kan u <code>img</code> toevoegen aan de optie <code>Te Verwijderen Tags</code>."

PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION="Horizontaal wegsnijden"
PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION_DESCRIPTION="Geef hier aan welk gedeelte van de afbeelding mag weggesneden worden, indien na herschaling de afbeelding niet goed past in de opgegeven breedte van het pictogram. Door minimaal weg te snijden kan er voor gezorgd worden dat het pictogram precies de gewenste afmetingen heeft.<br /><strong>Opmerking:</strong> Indien wegsnijden uitgeschakeld wordt, kan het voorkomen dat de <em>hoogte van het pictogram kleiner</em> wordt dan de ingestelde waarde."

PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION="Verticaal wegsnijden"
PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION_DESCRIPTION="Geef hier aan welk gedeelte van de afbeelding mag weggesneden worden, indien na herschaling de afbeelding niet goed past in de opgegeven breedte van het pictogram. Door minimaal weg te snijden kan er voor gezorgd worden dat het pictogram precies de gewenste afmetingen heeft.<br /><strong>Opmerking:</strong> Indien wegsnijden uitgeschakeld wordt, kan het voorkomen dat de <em>breedte van het pictogram kleiner</em> wordt dan de ingestelde waarde."

PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_WITH_CONTENTS="Te Verwijderen {tokens}<br />Met Inhoud"
PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION="Geef hier een lijst van woorden zonder { } markeringen, gescheiden door een <strong>komma</strong>, die de plugin altijd moet verwijderen <strong>samen met alle tekst dat zich tussen de openende en sluitende token bevindt</strong>.<br /><strong>Opmerking:</strong> Op zichzelf staande tokens worden niet ondersteund.<br /><strong>Opmerking:</strong> Waneer een {token} hierdoor wordt verwijderd, wordt de tekst als afgekort beschouwd. Deze 'eigenschap' wordt gebruikt in de andere secties om te bepalen of een pictogram, prefix, inline suffix en/of suffix toegevoegd moet worden.<br /><strong>Voorbeeld:</strong> Voor de extensie <em>Tabs &amp; Slides</em> dient u een tekst gelijkaardig aan <code>{slide=mijntitel}zus en zo{/slide}</code> in te voegen in de tekst. U kan deze code verbergen in het afgekorte artikel door hier <code>slide</code> toe te voegen."

PLG_CONTENT_READLESSTEXT_CUT_OFF_TEXT_LENGTH="Lengte Afgekorte Tekst"
PLG_CONTENT_READLESSTEXT_CUT_OFF_TEXT_LENGTH_DESCRIPTION="Geef een getal in: dit getal is uitgedrukt in het aantal eenheden zoals ingesteld in de optie <code>Lengte Eenheid</code>. Wanneer het artikel wordt afgekort, worden het hier opgegeven aantal <em>eenheden</em> behouden. Dit getal mag groter of kleiner zijn dan het getal hierboven."

PLG_CONTENT_READLESSTEXT_DATE_FORMAT="Formaat Datums"
PLG_CONTENT_READLESSTEXT_DATE_FORMAT_DESCRIPTION="Geef hier het formaat op van elke datum die als pre- of suffix moet worden toegevoegd. Gebruik hiervoor de codes zoals beschreven bij de uitleg van de PHP functie <code>date</code>. (Een link vindt u in de uitleg hierlangs.)<br /><strong>Voorbeeld:</strong> <em>Maandag, 3 december</em> heeft als formaat <code>l, F j</code><br /><strong>Voorbeeld:</strong> <em>Din 06:28</em> heeft als formaat <code>D H:i</code><br /><strong>Voorbeeld:</strong> <em>2012-07-28</em> heeft als formaat <code>Y-m-d</code>"

PLG_CONTENT_READLESSTEXT_DEFAULT_THUMBNAIL_TEMPLATE="Standaard Pictogram"
PLG_CONTENT_READLESSTEXT_DEFAULT_THUMBNAIL_TEMPLATE_DESCRIPTION="Geef hier de locatie van het pictogram dat gebruikt moet worden indien er geen geschikte afbeelding werd gevonden in het artikel. Het opgegeven pad kan absoluut of relatief ten opzichte van de <em>root</em> van uw Joomla! installatie.<br /><em>Het standaard pictogram wordt herschaald en bijgehouden in de Joomla! cache door read less text, net als een afbeelding die in het artikel wordt gevonden. Alleen de minimum voorwaarden worden niet gecontroleerd.</em><br /><strong>Opmerking:</strong> Laat dit veld leeg om geen pictogram in te voegen indien er geen geschikte afbeelding werd gevonden in het artikel. <ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> Indien er - na het vervangen van de tags - op de opgegeven locatie geen bestand gevonden wordt, wordt geen pictogram ingevoegd."

PLG_CONTENT_READLESSTEXT_DISALLOWED="Inactief"
PLG_CONTENT_READLESSTEXT_DISALLOWED_DESCRIPTION="Geef hier een lijst van <em>context</em>en, gescheiden door een <em>komma</em>. Kijk de uitleg hierlangs na voor een volledig overzicht. Indien dit veld niet leeg is, zal de plugin <em>nooit</em> actief zijn op artikels of <em>items</em> in de opgegeven contexten. Indien dit veld leeg is, wordt er geen beperking ingesteld. <strong>Met de mode <code>Ontdekken</code> actief, wordt de meest specifieke context voor elke artikel of <em>item</em> getoond.</strong>"

PLG_CONTENT_READLESSTEXT_DISCOVER="<strong>Ontdekken</strong>"
PLG_CONTENT_READLESSTEXT_DISCOVER_DESCRIPTION="Indien deze mode actief is, wordt de tekst van elk artikel waar <em>read less text</em> actief <em>kan</em> zijn vervangen door alle informatie die u nodig heeft om de opties in deze sectie precies in te stellen of na te kijken. <strong>Alleen gebruikers die toegang hebben tot het back-end gedeelte van deze site zullen deze informatie te zien krijgen: gewone bezoekers blijven de artikels zien zoals voorheen.</strong> Met deze extra informatie kan u gemakkelijk uitzoeken of en waarom deze plugin actief is op elk artikel, en welke context hier van toepassing is. De gewenste contexten kan u invullen in de opties <code>Actief</code> en <code>Inactief</code>."

PLG_CONTENT_READLESSTEXT_EXTRA_SELF_CLOSING_TAGS="XHTML Afwijkende &lt;tags&gt;"
PLG_CONTENT_READLESSTEXT_EXTRA_SELF_CLOSING_TAGS_DESCRIPTION="Geef hier een lijst van HTML tags zonder &lt; &gt; markeringen, gescheiden door een <strong>komma</strong>, die de plugin moet beschouwen als een op zichzelf staande tag, waar geen bijhorende sluitende tag bij moet horen. Je kan hier bijvoorbeeld de HTML tag <code>p</code> opgeven, indien in de tekst de paragrafen niet (altijd) gesloten worden met <code>/p</code>; of de HTML tag <code>br</code>, indien dit in de HTML code niet altijd gevolgd wordt door het sluitende teken <code>/</code>. Deze plugin zou anders door behoud van opmaak te verzekeren extra witruimte genereren.<br /><strong>Een goede keuze lijkt <code>br, hr, img</code></strong>."

PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX="Aansluitende Suffix<br />Voor Gasten"
PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_DESCRIPTION="<strong>Alleen voor gasten.</strong> Geef hier de tekst in die toegevoegd moet worden na de afgekorte tekst, maar vooraleer de nog epenstaande tags gesloten zijn. U kan hier HTML code plaatsen.<ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> De standaard waarde imiteert de (Engelse) standaard <em>Lees meer</em> code waar Joomla! in voorziet. Als u het veld leeg maakt, wordt de standaard waarde terug ingesteld.<br /><strong>Opmerking:</strong> Indien u hier geen suffix wenst, maar ook niet de hele sectie wil uitschakelen, kan u hier een spatie opgeven.<br /><strong>Opmerking:</strong> Indien bij de optie <code>Schakel extra vertaalslag in</code> voor <em>Ja</em> is gekozen, moet hier een codewoord staan; de werkelijke suffix dient u dan in te geven bij <em>Taalbeheer</em>.<br /><strong>Opmerking:</strong> <code>url</code> zal <em>altijd</em> verwijzen naar de (SEO geoptimaliseerde) url waar het volledige artikel kan gelezen worden. Indien u de optie <code>Beperk Toegang Voor Gasten</code> in de sectie <code>Wanneer Actief</code> gebruikt, is het waarschijnlijk beter om dit token niet te gebruiken: gebruik in plaats daarvan de url van uw login pagina, e.g. <code>index.php?option=com_users&amp;view=login&amp;Itemid=102</code>"

PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE="Maak Link Van Aansluitende Suffix Voor Gasten"
PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>Alleen voor gasten.</strong> Kies <em>Ja</em> om automatisch de opgegeven suffix (tekst of HTML) om te vormen tot een link, die leidt naar het volledige artikel."

PLG_CONTENT_READLESSTEXT_GUEST_PREFIX="Prefix Voor Gasten"
PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_DESCRIPTION="<strong>Alleen voor gasten.</strong> Geef hier de tekst in die voor elke tekst toegevoegd moet worden, of hij nu afgekort wordt of niet. U kan hier HTML code plaatsen.<ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> Laat dit veld leeg om vooraan niets toe te voegen.<br /><strong>Opmerking:</strong> Indien bij de optie <code>Schakel extra vertaalslag in</code> voor <em>Ja</em> is gekozen, moet hier een codewoord staan; de werkelijke prefix dient u dan in te geven bij <em>Taalbeheer</em>.<br /><strong>Opmerking:</strong> <code>url</code> zal <em>altijd</em> verwijzen naar de (SEO geoptimaliseerde) url waar het volledige artikel kan gelezen worden. Indien u de optie <code>Beperk Toegang Voor Gasten</code> in de sectie <code>Wanneer Actief</code> gebruikt, is het waarschijnlijk beter om dit token niet te gebruiken: gebruik in plaats daarvan de url van uw login pagina, e.g. <code>index.php?option=com_users&amp;view=login&amp;Itemid=102</code>"

PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_LINKS_TO_FULL_ARTICLE="Maak Link Van Prefix<br />Voor Gasten"
PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>Alleen voor gasten.</strong> Kies <em>Ja</em> om automatisch de opgegeven prefix (tekst of HTML) om te vormen tot een link, die leidt naar het volledige artikel. Indien u hier <em>Nee</em> kiest, dient u er zelf voor te zorgen dat de gebruiker op een andere manier het volledige artikel kan bereiken: door de titel als link te gebruiken, of door er voor te zorgen dat er altijd een pictogram gegenereerd wordt, of door zelf de HTML code te voorzien in de suffix. In het laatste geval kan u de token <code>{url}</code> gebruiken in combinatie met de HTML tag <code>a</code>."

PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX="Suffix Voor Gasten"
PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_DESCRIPTION="<strong>Alleen voor gasten.</strong> Geef hier de tekst in die na elke <em>afgekorte</em> tekst toegevoegd moet worden. Deze waarde vervangt de standaard <em>Lees Meer</em> aanduiding. U kan hier HTML code plaatsen.<ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> De standaard waarde imiteert de (Engelse) standaard <em>Lees meer</em> code waar Joomla! in voorziet. Als u het veld leeg maakt, wordt de standaard waarde terug ingesteld.<br /><strong>Opmerking:</strong> Indien u hier geen suffix wenst, maar ook niet de hele sectie wil uitschakelen, kan u hier een spatie opgeven.<br /><strong>Opmerking:</strong> Indien bij de optie <code>Schakel extra vertaalslag in</code> voor <em>Ja</em> is gekozen, moet hier een codewoord staan; de werkelijke suffix dient u dan in te geven bij <em>Taalbeheer</em>.<br /><strong>Opmerking:</strong> <code>url</code> zal <em>altijd</em> verwijzen naar de (SEO geoptimaliseerde) url waar het volledige artikel kan gelezen worden. Indien u de optie <code>Beperk Toegang Voor Gasten</code> in de sectie <code>Wanneer Actief</code> gebruikt, is het waarschijnlijk beter om dit token niet te gebruiken: gebruik in plaats daarvan de url van uw login pagina, e.g. <code>index.php?option=com_users&amp;view=login&amp;Itemid=102</code>"

PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_LINKS_TO_FULL_ARTICLE="Maak Link Van Suffix<br />Voor Gasten"
PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>Alleen voor gasten.</strong> Kies <em>Ja</em> om automatisch de opgegeven suffix (tekst of HTML) om te vormen tot een link, die leidt naar het volledige artikel. Indien u hier <em>Nee</em> kiest, dient u er zelf voor te zorgen dat de gebruiker op een andere manier het volledige artikel kan bereiken: door de titel als link te gebruiken, of door er voor te zorgen dat er altijd een pictogram gegenereerd wordt, of door zelf de HTML code te voorzien in de suffix. In het laatste geval kan u de token <code>{url}</code> gebruiken in combinatie met de HTML tag <code>a</code>.<br /><strong>Opmerking:</strong> De standaard waarde imiteert de (Engelse) standaard <em>Lees meer</em> code waar Joomla! in voorziet, en deze bevat al de juiste HTML code om een link naar het volledige artikel weer te geven. In dat geval kan u deze optie best uitschakelen."

PLG_CONTENT_READLESSTEXT_INLINE_SUFFIX_AS_THUMBNAIL_TITLE="Artikel inline suffix"

PLG_CONTENT_READLESSTEXT_LENGTH_UNIT="Lengte Eenheid"
PLG_CONTENT_READLESSTEXT_LENGTH_UNIT_DESCRIPTION="Kies hier de eenheid waarin de twee getallen hierboven - zowel <code>Minimum Lengte Tekst</code> and <code>Lengte Afgekorte Tekst</code> - zijn uitgedrukt.<ul>Opmerkingen en beperkingen:<li>Een spatie of een tab wordt ook geteld als een <code>karakter</code>, maar opeenvolgende witruimte wordt samengenomen en geteld als één karakter.</li><li>Tussen twee <code>woorden</code> in eenzelfde paragraaf moet er witruimte zijn, om ze ook als twee woorden te kunnen herkennen. Twee woorden met daartussen alleen een punt . (zoals bijvoorbeeld <em>hier.daar</em>) worden als één woord geteld.</li><li>Twee <code>zinnen</code> worden als zodanig herkend wanneer ze gescheiden worden door een van de volgende leestekens: <code>. ? ! ¿</code>, of door een paragraaf-einde, het einde van een rij in een tabel, of het einde van een item in een opsommingslijst. Opeenvolgende leestekens of code die een zin beëindigen (Bijvoorbeeld <code>Wat?!?!!</code>) worden samengenomen en geteld als één zinseinde. Twee zinnen zonder witruimte daartussen (bijvoorbeeld <em>Doe dit.Doe dat</em>) worden als twee zinnen geteld.<br /><em>Indien uw artikels veel afkortingen of versienummers bevatten (bijvoorbeeld <code>R.E.M.</code> en <code>Joomla! 2.5.99</code>), geeft de optie <code>zin</code> waarschijnlijk geen goed resultaat.</em></li><li>De HTML tag <code>p</code> wordt herkend als het einde van een <code>paragraaf</code> (HTML code: <code>&lt;/p&gt;</code>); ook het einde van een opsommingslijst verhoogt de paragraaf-teller. Titels gemarkeerd met tags als <code>h1</code>, <code>h2</code>, enz. worden niet geteld als een paragraaf. Lege paragrafen worden niet meegeteld.</li></ul>"

PLG_CONTENT_READLESSTEXT_LINK_THUMBNAIL="Maak Link"
PLG_CONTENT_READLESSTEXT_LINK_THUMBNAIL_DESCRIPTION="Kies <code>Ja</code> om een link te maken van het pictogram: de gebruiker kan dan met een klik op het pictogram het volledige artikel zien."

PLG_CONTENT_READLESSTEXT_MAX_IMAGE_LOAD_TIME="Maximale laadtijd"
PLG_CONTENT_READLESSTEXT_MAX_IMAGE_LOAD_TIME_DESCRIPTION="Geef hier een getal in. Dit is de maximale laadtijd in seconden die gespendeerd mag worden door <em>read less text</em> bij het aanmaken van een pictogram van een afbeelding die op een andere server staat.<br />Een lange laadtijd kan optreden wanneer de andere server (tijdelijk) slecht toegankelijk is. In dit geval kan de laadtijd van uw eigen pagina's verbeterd worden door hier een lage waarde in te geven, bijvoorbeeld <code>2</code>. <br /><strong>Opmerking:</strong> Geef hier <code>0</code> in om de maximale waarde te gebruiken dat <em>read less text</em> bereid is te wachten - de huidige waarde is <code>11</code> seconden."
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_HEIGHT="Minimum Hoogte"
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_HEIGHT_DESCRIPTION="Geef een getal in. Alleen afbeeldingen waarvan de <strong>hoogte</strong> in pixels gelijk is aan of groter is dan dit getal komen in aanmerking om als pictogram gebruikt te worden.<br />De eerste afbeelding die aan alle hieronder opgelegde voorwaarden voldoet wordt herschaald en vooraan de afgekorte tekst ingevoegd.<br><strong>Opmerking:</strong> Elke afbeelding die niet aan alle voorwaarden voldoet blijft in de tekst staan. Indien u in de afgekorte tekst geen enkele afbeelding wil zien behalve het uitgekozen pictogram, kan u <code>img</code> toevoegen aan de optie <code>Te Verwijderen Tags</code>."
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_RATIO="Minimum Verhouding"
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_RATIO_DESCRIPTION="Geef een kommagetal tussen 0 en 1 in (met een punt als scheidingsteken). Alleen afbeeldingen waarvan de <strong>verhouding</strong> in procent gelijk is aan of groter is dan dit getal komen in aanmerking om als pictogram gebruikt te worden.<br /><strong>Voorbeelden</strong>: een vierkant heeft een verhouding gelijk aan <code>1.00</code>; en de verhouding <code>0.25</code> geeft aan dat de afbeelding ofwel vier keer zo hoog is als breed, ofwel vier keer zo breed is dan hoog.<br />De eerste afbeelding die aan alle hier opgelegde voorwaarden voldoet wordt herschaald en vooraan de afgekorte tekst ingevoegd.<br><strong>Opmerking:</strong> Elke afbeelding die niet aan alle voorwaarden voldoet blijft in de tekst staan. Indien u in de afgekorte tekst geen enkele afbeelding wil zien behalve het uitgekozen pictogram, kan u <code>img</code> toevoegen aan de optie <code>Te Verwijderen Tags</code>."
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_WIDTH="Minimum Breedte"
PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_WIDTH_DESCRIPTION="Geef een getal in. Alleen afbeeldingen waarvan de <strong>breedte</strong> in pixels gelijk is aan of groter is dan dit getal komen in aanmerking om als pictogram gebruikt te worden.<br />De eerste afbeelding die aan alle hier opgelegde voorwaarden voldoet wordt herschaald en vooraan de afgekorte tekst ingevoegd.<br><strong>Opmerking:</strong> Elke afbeelding die niet aan alle voorwaarden voldoet blijft in de tekst staan. Indien u in de afgekorte tekst geen enkele afbeelding wil zien behalve het uitgekozen pictogram, kan u <code>img</code> toevoegen aan de optie <code>Te Verwijderen Tags</code>."
PLG_CONTENT_READLESSTEXT_MINIMUM_TEXT_LENGTH="Minimum Lengte Tekst"
PLG_CONTENT_READLESSTEXT_MINIMUM_TEXT_LENGTH_DESCRIPTION="Geef hier een lengte op, uitgedrukt in de eenheid zoals gekozen in de optie <code>Lengte Eenheid</code>. Indien de tekst in de opgegeven eenheid langer is dan dit getal, zal de plugin actief zijn en het artikel afkorten. Indien niet, zal de plugin geen enkele aanpassing aan het artikel maken. <br /><strong>Opmerking:</strong> Geef hier 0 in om deze beperking uit te schakelen."
PLG_CONTENT_READLESSTEXT_MODULE_SCOPE="In module scope"
PLG_CONTENT_READLESSTEXT_MODULE_SCOPE_DESCRIPTION="Met deze optie en de optie hierboven kan u het gebruik van <em>read less text</em> verder beperken. Tijdens de opbouw van een pagina kunnen modules tekst van artikels tonen. In een aantal gevallen laat een module ook de tussenkomst toe van <em>read less text</em> (technisch: het event <code>nContentBeforeDisplay</code> wordt gegenereerd). Een voorbeeld is de standard Joomla! module <em>News Flash</em> (<code>mod_newsflash</code>)<br /><ul>Met deze optie kan u er voor kiezen of <em>read less text</em>, op de output van een module,<li>altijd actief moet zijn op de output van een module</li><li>de context regels moet volgen zoals hieronder ingesteld, of</li><li>nooit actief mag zijn op de output van een module</li></ul>. Als de laatste keuze wordt gemaakt, worden de opties <code>Standaard Instelling?</code>, <code>Actief</code> en <code>Inactief</code> genegeerd voor alle output van elke component."

PLG_CONTENT_READLESSTEXT_NOTES0="Notities"
PLG_CONTENT_READLESSTEXT_NOTES0_DESCRIPTION="Dit veld wordt niet gebruikt door <em>read less text</em>. U kan dit veld gebruiken om eender welke informatie te bewaren dat gerelateerd is aan <em>read less text</em> en het specifiek gebruik van bovenstaande contexten, bijvoorbeeld de reden(en) waarom een context werd toegevoegd - indien u na verloop van tijd bovenstaande velden wilt bewerken, kan dit er voor zorgen dat u gemakkelijker en sneller de wijzigingen kunt aanbrengen."
PLG_CONTENT_READLESSTEXT_NO_THUMBNAIL_TITLE="Geen"

PLG_CONTENT_READLESSTEXT_PARAGRAPH="paragraaf"
PLG_CONTENT_READLESSTEXT_PREFIX_AS_THUMBNAIL_TITLE="Artikel prefix"

PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK="Behoud Positie Bestaande<br/><em>Lees Meer</em> Link"
PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK_DESCRIPTION="Duid het gewenste gedrag aan indien een tekst reeds een bestaande <em>Lees Meer</em> link bevat, die werd toegevoegd met behulp van de standaard <em>Lees Meer</em> knop. <ul>U kan er voor kiezen: <li><strong>om deze in zijn geheel te negeren</strong>: kies dan <code>Nee</code>.<br />De tekst wordt dan afgekort net alsof er nog geen <em>Lees Meer</em> link was ingevoegd.</li><li><strong>om deze in zijn geheel te respecteren</strong>: kies dan <code>Ja</code>.<br />De tekst vóór de <em>Lees Meer</em> link - de <em>intro tekst</em> wordt dan als afgekorte tekst genomen. De opties hierboven worden dan genegeerd; alle andere opties blijven wel nog geldig. De intro tekst wordt als 'afgekort' beschouwd. - deze 'eigenschap' wordt gebruikt om te bepalen of er een pictogram, prefix, inline suffix of suffix toegevoegd moet worden.</li><li><strong>om het te gebruiken als een bijkomende limiet op de te gebruiken tekst</strong>: kies dan <code>Gedeeltelijk</code>.<br />Er wordt dan geen tekst weergegeven in de afgekorte tekst dat ná het bestaande <em>Lees Meer</em> link staat. Indien de introtekst langer is dan de hierboven opgegeven criteria, wordt de introtekst afgekort; anders wordt de volledige introtekst behouden. <br />De optie <code>Toon Intro Tekst</code> wordt normaal gebruikt om de intro tekst te verbergen wanneer één enkel artikel wordt getoond op een pagina (en indien <em>read less text</em> niet actief is op die pagina). Met deze derde optie past <em>read less text</em> dit ook omgelkeerd toe: <em>alleen</em> de intro tekst wordt dan weerhouden op alle pagina's waar <em>read less text</em> actief mag zijn.<br />De tekst wordt <em>niet</em> als afgekort beschouwd <em>indien</em> if de volledige intro tekst getoond wordt.</li></ul><strong>Opmerking:</strong> deze instelling beïnvloedt andere instellingen niet: bijvooorbeeld de <em>Lees Meer</em> tekst zoals onder ingesteld wordt nog altijd gebruikt.<br /><strong>Opmerking:</strong> Bij het zoeken naar een geschikt pictogram wortdt altijd het volledige artikel gebruikt, ongeacht de waarde van deze instelling."
PLG_CONTENT_READLESSTEXT_RESPECT_SHOWINTRO="Alleen in combinatie met <code>Toon Intro</code>"
PLG_CONTENT_READLESSTEXT_RETAIN_WHOLE_WORDS="Hele Woorden"
PLG_CONTENT_READLESSTEXT_RETAIN_WHOLE_WORDS_DESCRIPTION="Kies <em>Ja</em> om alleen af te breken tussen twee woorden in. De afgekorte tekst kan dan lichtjes korter worden. In elk geval wordt altijd minstens 1 woord weerhouden.<br /><strong>Opmerking:</strong> Deze optie heeft alleen een effect indien <code>karakter</code> als <code>Lengte Eenheid</code> is gekozen."

PLG_CONTENT_READLESSTEXT_SCOPE_ACCORDING_TO_CONTEXTS="Volgens de opties hieronder"
PLG_CONTENT_READLESSTEXT_SCOPE_ALWAYS="Altijd, ongeacht de opties hieronder"
PLG_CONTENT_READLESSTEXT_SCOPE_NEVER="Nooit, ongeacht de opties hieronder"
PLG_CONTENT_READLESSTEXT_SENTENCE="zin"
PLG_CONTENT_READLESSTEXT_SPECIFIC_USAGE="Nee, gebruik de velden hieronder"
PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_WITH_CONTENTS="Te Verwijderen [tokens]<br />Met Inhoud"
PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION="Geef hier een lijst van woorden zonder [ ] markeringen, gescheiden door een <strong>komma</strong>, die de plugin altijd moet verwijderen <strong>samen met alle tekst dat zich tussen de openende en sluitende token bevindt</strong>.<br /><strong>Opmerkingen:</strong> Op zichzelf staande tokens worden niet ondersteund.<br /><strong>Opmerking:</strong> Waneer een {token} hierdoor wordt verwijderd, wordt de tekst als afgekort beschouwd. Deze 'eigenschap' wordt gebruikt in de andere secties om te bepalen of een pictogram, prefix, inline suffix en/of suffix toegevoegd moet worden.<br /><strong>Voorbeeld:</strong> Voor de extensie <em>EmbedChessboard</em> dient u een tekst gelijkaardig aan <code>[pgn]schaakzetten[/pgn]</code> in te voegen in de tekst. U kan deze code verbergen in het afgekorte artikel door hier <code>pgn</code> toe te voegen."
PLG_CONTENT_READLESSTEXT_SUFFIX_AS_THUMBNAIL_TITLE="Artikel suffix"

PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE="Te Verwijderen &lt;tags&gt;"
PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_DESCRIPTION="Geef hier een lijst van HTML tags zonder &lt; &gt; markeringen, gescheiden door een <strong>komma</strong>, die de plugin altijd moet verwijderen. Je kan hier bijvoorbeeld <code>a, img</code> inpgeven, zodat links en foto's alleen beschikbaar zijn indien het volledige artikel wordt geladen. Laat dit veld leeg om geen tags te verwijderen; geef hier <code>all</code> in om alle tags en dus ook opmaak te verwijderen.<br /><strong>Opmerking:</strong> Zelfs met <code>img</code> hier toegevoegd, is het mogelijk om de eerste foto of tekening te gebruiken als pictogram in het afgekorte artikel.<br /><strong>Opmerking:</strong> De tekst wordt <em>niet</em> beschouwd als afgekort wanneer door het verwijderen van een een tag door deze optie."
PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_WITH_CONTENTS="Te Verwijderen &lt;tags&gt;<br />Met Inhoud"
PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION="Geef hier een lijst van HTML tags zonder &lt; &gt; markeringen, gescheiden door een <strong>komma</strong>, die de plugin altijd moet verwijderen <strong>samen met alle HTML tags en tekst dat zich tussen de openende en sluitende tag bevindt</strong>. U kan hier bijvoorbeeld de HTML tag <code>table</code> opgeven, indien u in de afgekorte tekst geen tabellen wil tonen. Deze optie kan u ook gebruiken om extra opmaak regels te verwijderen in de afgekorte tekst waardoor uw pagina uniformer wordt.<br /><strong>Een goede keuze lijkt <code>style, nav, menu, footer, script, head, form, noscript</code></strong>.<br /><strong>Opmerking:</strong> Waneer een {token} hierdoor wordt verwijderd, wordt de tekst als afgekort beschouwd. Deze 'eigenschap' wordt gebruikt in de andere secties om te bepalen of een pictogram, prefix, inline suffix en/of suffix toegevoegd moet worden."
PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE="Tooltip"
PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE_DESCRIPTION="kies hier welke tekst gekozen moet worden als titel van het pictogram. Deze test zal worden gebruikt als tooltip wanneer de gebruiker met mus over het pictogram beweegd.<br /><strong>Opmerking:</strong> Het is niet mogelijk om opmaak toe te voegen in een tooltip. De tekst zal daartom getoond worden zonder de HTML tags die eventueel vorokomen in de geselecteerde tekst."
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_COLOR="Randkleur"
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_COLOR_DESCRIPTION="De kleur van de rand rondom de verplaatste en herschaalde afbeelding. U kan hier een kleur opgeven in elk formaat dat CSS begrijpt. <br /><strong>Opmerking:</strong> Laat dit veld leeg om hiervoor geen specifieke opmaak toe te voegen.<br /><strong>Opmerking:</strong> Geef <code>-1</code> in bij <code>Randbreedte</code> om hiervoor geen specifieke opmaak toe te voegen."
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_STYLE="Randstijl"
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_STYLE_DESCRIPTION="Deze keuze bepaalt het type van de rand rondom het pictogram. Kies <code>None</code> om hiervoor geen specifieke opmaak toe te voegen."
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_WIDTH="Randbreedte"
PLG_CONTENT_READLESSTEXT_THUMB_BORDER_WIDTH_DESCRIPTION="De dikte in aantal pixels van de rand rondom het pictogram.<br /><strong>Opmerking:</strong> Geef hier <code>-1</code> in om hiervoor geen specifieke opmaak toe te voegen."
PLG_CONTENT_READLESSTEXT_THUMB_CACHE_TIME="Cache Tijd"
PLG_CONTENT_READLESSTEXT_THUMB_CACHE_TIME_DESCRIPTION="Geef een getal in. Dit bepaalt hoelang elke aangemaakte pictogram geldig blijft, uitgedrukt in seconden. Gebruik de standaard Joomla! functionaliteit om de verlopen cache te verwijderen <code>Site &gt; Maintenance &gt; Purge Expired Cache</code>).<br /><strong>Opmerking:</strong> Deze cache kan niet uitgeschakeld worden."
PLG_CONTENT_READLESSTEXT_THUMB_CLASS="Class"
PLG_CONTENT_READLESSTEXT_THUMB_CLASS_DESCRIPTION="Voor een precieze en volledige opmaak van het pictogram, kan u hier de naam van een <em>CSS class</em> opgeven.<br /><strong>Opmerking:</strong> de andere keuzes die hierboven werden gemaakt krijgen voorrang op opmaak die aan de opgegeven <em>CSS class</em> gekoppeld wordt."
PLG_CONTENT_READLESSTEXT_THUMB_HEIGHT="Pictogram Hoogte"
PLG_CONTENT_READLESSTEXT_THUMB_HEIGHT_DESCRIPTION="Geef een getal in. Dit wordt de gewenste hoogte van het pictogram, uitgedrukt in pixels. De afbeelding die voldoet aan alle voorwaarden wordt herschaald tot zowel hoogte als breedte passen in de opgegeven dimensies. <br /><strong>Opmerking:</strong> Geef hier 0 in indien u geen beperking in de hoogte wenst. De verhouding van hoogte en breedte van de originele afbeelding blijft in elk geval behouden."
PLG_CONTENT_READLESSTEXT_THUMB_MARGIN="Marge"
PLG_CONTENT_READLESSTEXT_THUMB_MARGIN_DESCRIPTION="<dl>De in te stellen witruimte rondom het pictogram. U kan op 4 verschillende manieren de witruimte bepalen, door telkens een verschillend aantal getallen in te geven:<dt><strong>1 getal</strong></dt><dd>Deze waarde wordt gebruikt rondom het hele pictogram.</dd><dt><strong>2 getallen</strong></dt><dd>De eerste waarde wordt gebruikt om de witruimte in te stellen boven- en onderaan het pictogram,<br />de tweede waarde stelt de witruimte in aan de linker- en rechterkant.</dd><dt><strong>3 getallen</strong></dt><dd>De eerste waarde bepaalt de witruimte boven het pictogram,<br />de tweede waarde wordt gebruikt aan de linker- en rechterkant,<br />de derde waarde onderaan het pictogram.</dd><dt><strong>4 getallen</strong></dt><dd>Elk getal wordt gebruikt voor één zijde, waarbij kloksgewijs rond het pictogram wordt gegaan, bovenaan te beginnen: bovenkant, rechterkant, onderkant, linkerkant.</dd></dl><strong>Opmerking:</strong> Indien er geen eenheid is opgegeven, wordt verondersteld dat de waarden in pixels zijn uitgedrukt.<br /><strong>Opmerking:</strong> Geef hier <code>-1</code> in om hiervoor geen specifieke opmaak toe te voegen.<br /><strong>Opmerking:</strong> Laat dit veld leeg om geen expliciete keuze te maken (zodat de opgegeven CSS class de opmaak bepaalt).<br /><strong>Voorbeeld:</strong> <code>6</code><br />zorgt voor een witruimte van 6 pixels rondom het pictogram.<br /><strong>Voorbeeld:</strong> <code>0px 10px 10 0</code><br />lijkt goed geschikt wanneer het pictogram bovenaan links wordt geplaatst; er is dan alleen maar een witruimte van 10 pixels aan de rechter- en onderkant.<br /><strong>Voorbeeld:</strong> <code>4 4 1em</code><br />stelt een witruimte van 4 pixels in aan drie zijden, en een witruimte van 1 <em>em</em> onderaan het pictogram."
PLG_CONTENT_READLESSTEXT_THUMB_PADDING="Padding"
PLG_CONTENT_READLESSTEXT_THUMB_PADDING_DESCRIPTION="De padding waarde in aantal pixels rondom het pictogram.<br /><strong>Opmerking:</strong> Geef hier <code>-1</code> in om hiervoor geen specifieke opmaak toe te voegen."
PLG_CONTENT_READLESSTEXT_THUMB_POSITION="Pictogram Positie"
PLG_CONTENT_READLESSTEXT_THUMB_POSITION_DESCRIPTION="Het pictogram wordt in de opgegeven positie ingevoegd."
PLG_CONTENT_READLESSTEXT_THUMB_WIDTH="Pictogram Breedte"
PLG_CONTENT_READLESSTEXT_THUMB_WIDTH_DESCRIPTION="Geef een getal in. Dit wordt de gewenste breedte van het pictogram, uitgedrukt in pixels. De afbeelding die voldoet aan alle voorwaarden wordt herschaald tot zowel hoogte als breedte passen in de opgegeven dimensies. <br /><strong>Opmerking:</strong> Geef hier 0 indien u geen beperking in de breedte wenst. De verhouding van hoogte en breedte van de originele afbeelding blijft in elk geval behouden."
PLG_CONTENT_READLESSTEXT_TRANSLATE_ADDITIONS="Schakel extra vertaalslag in"
PLG_CONTENT_READLESSTEXT_TRANSLATE_ADDITIONS_DESCRIPTION="Duid hier aan of u meerdere talen tegelijk wilt aanbieden. Indien u hier <em>Ja</em> kiest, kunnen alle velden hier op deze configuratiepagina waarvan de velden zichtbaar kunnen worden voor de gebruiker, vertaald worden in de taal van die gebruiker.<ul>De voor de gebruiker zichtbare velden zijn:<li><code>Prefix Voor Aangemelde Bezoekers</code></li><li><code>Prefix Voor Gasten</code></li><li><code>Suffix Voor Aangemelde Bezoekers</code></li><li><code>Suffix Voor Gasten</code></li></ul> Indien ingeschakeld, dienen deze velden <strong>niet</strong> de werkelijke pre- of suffix bevatten, maar een codewoord, waarbij alleen gebruik gemaakt mag worden van hoofdletters en het liggend streepje <code>_</code>. De <strong>volledige HTML pre- of suffix</strong> dient dan vervangen te worden, en het veld mag dan <strong>alleen nog maar dat ene codewoord</strong> bevatten. Bijvoorbeeld <code>MY_PREFIX</code> of <code>MY_TO_BE_TRANSLATED_TEXT</code>.<br /><br />Daarna maakt u gebruik van Joomla's language override functionaliteit om de gewenste vertalingen in iedere taal voor elk codewoord dat u heeft opgegeven. <ul>Hiervoor gaat u naar <em>Extensies > Taalbeheer > Overrides</em>:<li>Selecteer eerst een taal gebruik makend van de uitklappend elijst aan de rechterkant,</li><li>Klik daarna op <code>Nieuw</code>.</li><li>Vul het codewoord in bij <code>Language Constant</code>,</li><li>en uw vertaalde werkelijke pre- of suffix bij <code>Text</code>, volledig <strong>met alle HTML opmaak</strong> die u oorspronkelijk in een configuratieveld bij <em>read less text</em> had geplaatst. Ook blijft het mogelijk om de tokens gekend bij <em>read less text</em> te gebruiken bij <code>Text</code>.</li></ul><strong>Opmerking:</strong> Let er op dat de naam lang en specifiek genoeg is om uniek te zijn. Alle stukken tekst die vertaald kunnen worden op uw site hebben een overeenkomstig codewoord, en indien een codewoord wordt gekozen dat al in gebruik is op uw site, zal uw opgegeven vertaling ook daar gebruikt worden.<br />Gebruik bijvoorbeeld zeker niet <code>MOD_BREADCRUMBS_HERE</code> als codewoord om <em>read less text</em> te configureren."

PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX="Aansluitende Suffix<br />Aangemelde Bezoekers"
PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_DESCRIPTION="<strong>Alleen voor aangemelde bezoekers.</strong> Geef hier de tekst in die toegevoegd moet worden na de afgekorte tekst, maar vooraleer de nog epenstaande tags gesloten zijn. U kan hier HTML code plaatsen.<ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> De standaard waarde imiteert de (Engelse) standaard <em>Lees meer</em> code waar Joomla! in voorziet. Als u het veld leeg maakt, wordt de standaard waarde terug ingesteld.<br /><strong>Opmerking:</strong> Indien u hier geen suffix wenst, maar ook niet de hele sectie wil uitschakelen, kan u hier een spatie opgeven.<br /><strong>Opmerking:</strong> Indien bij de optie <code>Schakel extra vertaalslag in</code> voor <em>Ja</em> is gekozen, moet hier een codewoord staan; de werkelijke suffix dient u dan in te geven bij <em>Taalbeheer</em>."
PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE="Maak Link Van Aansluitende Suffix Voor Aangemelde Bezoekers"
PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="<strong>Alleen voor gasten.</strong> Kies <em>Ja</em> om automatisch de opgegeven suffix (tekst of HTML) om te vormen tot een link, die leidt naar het volledige artikel."
PLG_CONTENT_READLESSTEXT_USER_PREFIX="Prefix Voor<br />Aangemelde Bezoekers"
PLG_CONTENT_READLESSTEXT_USER_PREFIX_DESCRIPTION="<strong>Alleen voor aangemelde bezoekers.</strong> Geef hier de tekst in die voor elke tekst toegevoegd moet worden, of hij nu afgekort wordt of niet. U kan hier HTML code plaatsen.<ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> Laat dit veld leeg om vooraan niets toe te voegen.<br /><strong>Opmerking:</strong> Indien bij de optie <code>Schakel extra vertaalslag in</code> voor <em>Ja</em> is gekozen, moet hier een codewoord staan; de werkelijke prefix dient u dan in te geven bij <em>Taalbeheer</em>."
PLG_CONTENT_READLESSTEXT_USER_PREFIX_LINKS_TO_FULL_ARTICLE="Maak Link Van Suffix<br />Voor Aangemelde Bezoekers"
PLG_CONTENT_READLESSTEXT_USER_PREFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="Kies <em>Ja</em> om automatisch de opgegeven suffix (tekst of HTML) om te vormen tot een link, die leidt naar het volledige artikel. Indien u hier <em>Nee</em> kiest, dient u er zelf voor te zorgen dat de gebruiker op een andere manier het volledige artikel kan bereiken: door de titel als link te gebruiken, of door er voor te zorgen dat er altijd een pictogram gegenereerd wordt, of door zelf de HTML code te voorzien in de suffix. In het laatste geval kan u de token <code>{url}</code> gebruiken in combinatie met de HTML tag <code>a</code>."
PLG_CONTENT_READLESSTEXT_USER_SUFFIX="Suffix Voor<br />Aangemelde Bezoekers"
PLG_CONTENT_READLESSTEXT_USER_SUFFIX_DESCRIPTION="<strong>Alleen voor aangemelde bezoekers.</strong> Geef hier de tekst in die na elke <em>afgekorte</em> tekst toegevoegd moet worden. Deze waarde vervangt de standaard <em>Lees Meer</em> aanduiding. U kan hier HTML code plaatsen.<ul>Een aantal tags worden herkend en vervangen voor elk artikel:<li><code>{title}</code>, <code>{id}</code>, <code>{url}</code></li><li><code>{author}</code>, <code>{author_id}</code></li><li><code>{words}</code>, <code>{hits}</code></li><li><code>{created}</code>, <code>{modified}</code>, <code>{publish_up}</code></li><li><code>{category}</code>, <code>{category_id}</code></li><li><code>{component}</code></li></ul><strong>Opmerking:</strong> De standaard waarde imiteert de (Engelse) standaard <em>Lees meer</em> code waar Joomla! in voorziet. Als u het veld leeg maakt, wordt de standaard waarde terug ingesteld.<br /><strong>Opmerking:</strong> Indien u hier geen suffix wenst, maar ook niet de hele sectie wil uitschakelen, kan u hier een spatie opgeven.<br /><strong>Opmerking:</strong> Indien bij de optie <code>Schakel extra vertaalslag in</code> voor <em>Ja</em> is gekozen, moet hier een codewoord staan; de werkelijke suffix dient u dan in te geven bij <em>Taalbeheer</em>."
PLG_CONTENT_READLESSTEXT_USER_SUFFIX_LINKS_TO_FULL_ARTICLE="Maak Link Van Suffix<br />Voor Aangemelde Bezoekers"
PLG_CONTENT_READLESSTEXT_USER_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION="Kies <em>Ja</em> om automatisch de opgegeven suffix (tekst of HTML) om te vormen tot een link, die leidt naar het volledige artikel. Indien u hier <em>Nee</em> kiest, dient u er zelf voor te zorgen dat de gebruiker op een andere manier het volledige artikel kan bereiken: door de titel als link te gebruiken, of door er voor te zorgen dat er altijd een pictogram gegenereerd wordt, of door zelf de HTML code te voorzien in de suffix. In het laatste geval kan u de token <code>{url}</code> gebruiken in combinatie met de HTML tag <code>a</code>.<br /><strong>Opmerking:</strong> De standaard waarde imiteert de (Engelse) standaard <em>Lees meer</em> code waar Joomla! in voorziet, en deze bevat al de juiste HTML code om een link naar het volledige artikel weer te geven. In dat geval kan u deze optie best uitschakelen."

PLG_CONTENT_READLESSTEXT_WHEN="Standaard Instelling?"
PLG_CONTENT_READLESSTEXT_WHEN_DESCRIPTION="De standaard instelling is verondersteld tegemoet te komen aan de noden van de meeste gebruikers. U kan de standaard instelling ook weigeren en de velden eronder gebruiken om zo de volledige flexibiliteit te benutten die <em>read less text</em> u geeft."
PLG_CONTENT_READLESSTEXT_WRAPPER_CLASS="Wrapper Class"
PLG_CONTENT_READLESSTEXT_WRAPPER_CLASS_DESCRIPTION="Feef hier de gewenste <em>class</em> naam of namen in. Deze zullen worden toegekend aan de <code>Wrapper Tag</code>."
PLG_CONTENT_READLESSTEXT_WRAPPER_TAG="Wrapper Tag"
PLG_CONTENT_READLESSTEXT_WRAPPER_TAG_DESCRIPTION="<br />Kies hier de tag die u wilt gebruiken die rond uw artikel of <em>Item</em> geplaatst moet worden. Deze tag samen met de onderstaande optie <code>Wrapper Class</code> geeft u volledige flexibiliteit om de opmaak van uw artikels verder aan te passen.<br /><strong>Opmerking:</code> kies <code>Nee</code> om de optie niet toe te passen.<br /><strong>Opmerking:</strong> de tag - indien er een geselecteer is - zal worden gebruikt telkens <em>read less text</em> actief mag zijn."

; Option choices for
; - PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX,
; - PLG_CONTENT_READLESSTEXT_ADD_PREFIX,
; - PLG_CONTENT_READLESSTEXT_ADD_SUFFIX,
; - PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING and
; - PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL.
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE="Altijd wanneer read less text actief mag zijn"
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_LONG_ENOUGH="Altijd wanneer actief en het artikel lang genoeg is"
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_SHORTENED="Alleen wanneer het artikel wordt afgekort"
PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_USE_ARTICLE_MANAGER_OPTION="Respecteer de algemene optie 'Lees meer' Tonen"

PLG_CONTENT_READLESSTEXT_WORD="woord"

PLG_CONTENT_READLESSTEXT_UPPER_LEFT="Bovenaan links"
PLG_CONTENT_READLESSTEXT_UPPER_RIGHT="Bovenaan rechts"

PLG_CONTENT_READLESSTEXT_ARTICLE_TITLE_AS_THUMBNAIL_TITLE="Artikel titel"
PLG_CONTENT_READLESSTEXT_CHAR="letter"
PLG_CONTENT_READLESSTEXT_COMMON_USAGE="Ja, actief op alle artikel blog pagina's"

PLG_CONTENT_READLESSTEXT_CROP_BOTTOM="Toon de onderkant, snijd weg bovenaan"
PLG_CONTENT_READLESSTEXT_CROP_CENTER="Snijd evenveel weg aan beide kanten"
PLG_CONTENT_READLESSTEXT_CROP_FULL_HEIGHT="Niet verticaal wegsnijden: herschaal de volledige hoogte."
PLG_CONTENT_READLESSTEXT_CROP_FULL_WIDTH="Niet horizontaal wegsnijden: herschaal de volledige breedte."

PLG_CONTENT_READLESSTEXT_CROP_LEFT="Toon de linkerkant, snijd weg aan de rechterkant"
PLG_CONTENT_READLESSTEXT_CROP_RIGHT="Toon de rechterkant, snijd weg aan de linkerkant"
PLG_CONTENT_READLESSTEXT_CROP_TOP="Toon de bovenkant, snijd weg onderaan"
PK�j&])�O
�
�
readlesstext/readlesstext.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id: readlesstext.php 270 2014-11-24 21:43:01Z parvus $
 */

defined( '_JEXEC' ) or die;
require_once 'readlesstextmain.php';

class plgContentReadLessText extends JPlugin
{
  /**
   * Constructor
   * @param object &$subject The object to observe
   * @param array $config An optional associative array of configuration settings.
   */
  public function __construct( &$subject, $config = array() )
  {
    parent::__construct( $subject, $config );
    $this->loadLanguage();
    $this->_main = new ReadLessTextMain( $subject, $config );
  }

//  This function can not be used reliably.
//  It can be that another plugin altered the text as stored in the database before this plugin get execution time.
//  read less must then work on the altered text, not on the text as stored in the database.
//   /**
//    * Entry function. Will be called each time some article text has been
//    * saved. The article's lengths will be calculated and stored or updated
//    * in the database.
//    * @param string $context ignored
//    * @param JTableContent $article The item/article being prepared for display.
//    * @param bool $isNew If the content has just been created
//    * @note Article is passed by reference, but after the save, so no changes
//    *   will be saved.
//    * @return true
//    */
//   public function onContentAfterSave( $context, &$article, $isNew )
//   {
//     return true;
//   }

  /**
   * Entry function. Will be called each time some article text is to be
   * prepared for display.
   * @param string $context ignored
   * @param JTableContent $article The item/article being prepared for display.
   * @param $params ignored
   * @param integer $limitstart ignored
   * @return void
   */
  function onContentBeforeDisplay( $context, &$article, &$params, $limitstart = 0 )
  {
    $app = JFactory::getApplication();
    $scope = $app->scope;
    if ( !/*NOT*/key_exists( $scope, self::$_callCount ) )
    {
      self::$_callCount[ $scope ] = 0;
    }

    $this->_main->ReadLessText( $article, self::$_callCount[ $scope ], 'plg_content_readlesstext' );
  }
//   onContentPrepare is not used: the call is too limited.
//   $article only contains a text field, not the id and other needed fields.
//   function onContentPrepare( $context, &$article, &$params, $limitstart = 0 )
//   {
//     $app = JFactory::getApplication();
//     $scope = $app->scope;
//     if ( !/*NOT*/in_array( $scope, self::$_callCount ) )
//     {
//       self::$_callCount[ $scope ] = 0;
//     }
//     $this->ReadLessText( $article, self::$_callCount );
//   }

    private $_main = null;
    private static $_callCount = array();
}

?>
PK�j&]��N�
`
`readlesstext/readlesstext.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>

<extension type="plugin" group="content" version="2.5" method="upgrade">
  <name>Content - Read Less - Text</name>
  <version>v5.2 (r274)</version>
  <license>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
    http://www.gnu.org/licenses/gpl.html
  </license>
  <author>parvus</author>
  <authorEmail>1500@engineer.com</authorEmail>
  <authorUrl>http://joomlacode.org/gf/project/cutoff/</authorUrl>
  <copyright>Copyright (C) 2010-2014. All rights reserved.</copyright>
  <creationDate>November 2014</creationDate>

<!--  <updateservers>
    <server type="extension" priority="2" name="Read Less - Text - Updates">http://joomlacode.org/gf/project/cutoff/</server>
 </updateservers>
 --> 
  <config>
    <fields name="params">
      <fieldset name="info">
        <field name="readlesstextDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_DESCRIPTION" />
      </fieldset>
      <fieldset name="length">
        <field name="minimumTextLength" type="text" default="70" filter="integer" label="PLG_CONTENT_READLESSTEXT_MINIMUM_TEXT_LENGTH" description="PLG_CONTENT_READLESSTEXT_MINIMUM_TEXT_LENGTH_DESCRIPTION"></field>
        <field name="cutOffTextLength" type="text" default="50" filter="integer" label="PLG_CONTENT_READLESSTEXT_CUT_OFF_TEXT_LENGTH" description="PLG_CONTENT_READLESSTEXT_CUT_OFF_TEXT_LENGTH_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="lengthUnit" type="list" default="char" filter="word" label="PLG_CONTENT_READLESSTEXT_LENGTH_UNIT">
          <option value="char">PLG_CONTENT_READLESSTEXT_CHAR</option>
          <option value="word">PLG_CONTENT_READLESSTEXT_WORD</option>
          <option value="sentence">PLG_CONTENT_READLESSTEXT_SENTENCE</option>
          <option value="paragraph">PLG_CONTENT_READLESSTEXT_PARAGRAPH</option>
        </field>
        <field name="lengthUnitDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_LENGTH_UNIT_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="retainWholeWords" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_RETAIN_WHOLE_WORDS" description="PLG_CONTENT_READLESSTEXT_RETAIN_WHOLE_WORDS_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="respectExistingReadmoreLink" type="list" default="1" filter="string" label="PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK" description="">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
          <option value="respectShowIntro">PLG_CONTENT_READLESSTEXT_RESPECT_SHOWINTRO</option>
        </field>
        <field name="respectExistingReadmoreLinkDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_RESPECT_EXISTING_READMORE_LINK_DESCRIPTION" />
      </fieldset>
      
      <fieldset name="when-active">
        <field name="articleNumberSkipCount" type="text" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SKIP_COUNT" description="PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SKIP_COUNT_DESCRIPTION"></field>
        <field name="articleNumberShortenCount" type="text" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SHORTEN_COUNT" description="PLG_CONTENT_READLESSTEXT_ARTICLE_NUMBER_SHORTEN_COUNT_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="alwaysActiveForGuests" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_ALWAYS_ACTIVE_FOR_GUESTS">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="alwaysActiveForGuestsDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_ALWAYS_ACTIVE_FOR_GUESTS_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="componentScope" type="list" default="accordingToContexts" filter="word" label="PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE" description="PLG_CONTENT_READLESSTEXT_COMPONENT_SCOPE_DESCRIPTION">
<!--          <option value="always">PLG_CONTENT_READLESSTEXT_SCOPE_ALWAYS</option> -->
          <option value="accordingToContexts">PLG_CONTENT_READLESSTEXT_SCOPE_ACCORDING_TO_CONTEXTS</option>
          <option value="never">PLG_CONTENT_READLESSTEXT_SCOPE_NEVER</option>
        </field>        
        <field name="moduleScope" type="list" default="accordingToContexts" filter="word" label="PLG_CONTENT_READLESSTEXT_MODULE_SCOPE" description="PLG_CONTENT_READLESSTEXT_MODULE_SCOPE_DESCRIPTION">
          <option value="always">PLG_CONTENT_READLESSTEXT_SCOPE_ALWAYS</option>
          <option value="accordingToContexts">PLG_CONTENT_READLESSTEXT_SCOPE_ACCORDING_TO_CONTEXTS</option>
          <option value="never">PLG_CONTENT_READLESSTEXT_SCOPE_NEVER</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="when" type="list" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_WHEN" description="PLG_CONTENT_READLESSTEXT_WHEN_DESCRIPTION">
          <option value="0">PLG_CONTENT_READLESSTEXT_COMMON_USAGE</option>
          <option value="1">PLG_CONTENT_READLESSTEXT_SPECIFIC_USAGE</option>
        </field>
        <field name="allowed" type="textarea" cols="30" rows="6" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_ALLOWED" description="PLG_CONTENT_READLESSTEXT_ALLOWED_DESCRIPTION"></field>
        <field name="disallowed" type="textarea" cols="30" rows="6" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_DISALLOWED" description="PLG_CONTENT_READLESSTEXT_DISALLOWED_DESCRIPTION"></field>
        <field name="notes0" type="textarea" cols="30" rows="6" default="" filter="raw" label="PLG_CONTENT_READLESSTEXT_NOTES0" description="PLG_CONTENT_READLESSTEXT_NOTES0_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="discover" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_DISCOVER">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="discoverDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_DISCOVER_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
      </fieldset>

      <fieldset name="thumbnail">
        <field name="createThumbnail" type="list" default="when_shortened" filter="word" label="PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL">
          <option value="no">JNO</option>
          <option value="when_active">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE</option>
          <option value="when_shortened">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_SHORTENED</option>
        </field>
        <field name="createThumbnailDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_CREATE_THUMBNAIL_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="linkThumbnail" type="radio" default="1" filter="integer" label="PLG_CONTENT_READLESSTEXT_LINK_THUMBNAIL" description="PLG_CONTENT_READLESSTEXT_LINK_THUMBNAIL_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="thumbnailTitle" type="list" default="articleTitle" filter="word" label="PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE" description="PLG_CONTENT_READLESSTEXT_THUMBNAIL_TITLE_DESCRIPTION">
          <option value="0">PLG_CONTENT_READLESSTEXT_NO_THUMBNAIL_TITLE</option>
          <option value="articleTitle">PLG_CONTENT_READLESSTEXT_ARTICLE_TITLE_AS_THUMBNAIL_TITLE</option>
          <option value="prefix">PLG_CONTENT_READLESSTEXT_PREFIX_AS_THUMBNAIL_TITLE</option>
          <option value="inlineSuffix">PLG_CONTENT_READLESSTEXT_INLINE_SUFFIX_AS_THUMBNAIL_TITLE</option>
          <option value="suffix">PLG_CONTENT_READLESSTEXT_SUFFIX_AS_THUMBNAIL_TITLE</option>
        </field>
        <field name="thumbPosition" type="list" default="left" filter="word" label="PLG_CONTENT_READLESSTEXT_THUMB_POSITION" description="PLG_CONTENT_READLESSTEXT_THUMB_POSITION_DESCRIPTION">
          <option value="left">PLG_CONTENT_READLESSTEXT_UPPER_LEFT</option>
          <option value="right">PLG_CONTENT_READLESSTEXT_UPPER_RIGHT</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="defaultThumbnailTemplate" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_DEFAULT_THUMBNAIL_TEMPLATE"></field>
        <field name="defaultThumbnailTemplateDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_DEFAULT_THUMBNAIL_TEMPLATE_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="minimumImageWidth" type="text" default="32" filter="integer" label="PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_WIDTH" description="PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_WIDTH_DESCRIPTION"></field>
        <field name="minimumImageHeight" type="text" default="32" filter="integer" label="PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_HEIGHT" description="PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_HEIGHT_DESCRIPTION"></field>
        <field name="minimumImageRatio" type="text" default="0.10" filter="integer" label="PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_RATIO" description="PLG_CONTENT_READLESSTEXT_MINIMUM_IMAGE_RATIO_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="thumbWidth" type="text" default="123" filter="integer" label="PLG_CONTENT_READLESSTEXT_THUMB_WIDTH" description="PLG_CONTENT_READLESSTEXT_THUMB_WIDTH_DESCRIPTION"></field>
        <field name="thumbHeight" type="text" default="123" filter="integer" label="PLG_CONTENT_READLESSTEXT_THUMB_HEIGHT" description="PLG_CONTENT_READLESSTEXT_THUMB_HEIGHT_DESCRIPTION"></field>
        <field name="cropHorizontalPosition" type="list" default="left" filter="word" label="PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION" description="PLG_CONTENT_READLESSTEXT_CROP_HORIZONTAL_POSITION_DESCRIPTION">
          <option value="left">PLG_CONTENT_READLESSTEXT_CROP_LEFT</option>
          <option value="center">PLG_CONTENT_READLESSTEXT_CROP_CENTER</option>
          <option value="right">PLG_CONTENT_READLESSTEXT_CROP_RIGHT</option>
          <option value="no">PLG_CONTENT_READLESSTEXT_CROP_FULL_WIDTH</option>
        </field>
        <field name="cropVerticalPosition" type="list" default="top" filter="word" label="PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION" description="PLG_CONTENT_READLESSTEXT_CROP_VERTICAL_POSITION_DESCRIPTION">
          <option value="top">PLG_CONTENT_READLESSTEXT_CROP_TOP</option>
          <option value="center">PLG_CONTENT_READLESSTEXT_CROP_CENTER</option>
          <option value="bottom">PLG_CONTENT_READLESSTEXT_CROP_BOTTOM</option>
          <option value="no">PLG_CONTENT_READLESSTEXT_CROP_FULL_HEIGHT</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="thumbMargin" type="text" default="3" filter="words" label="PLG_CONTENT_READLESSTEXT_THUMB_MARGIN"></field>
        <field name="thumbMarginDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_THUMB_MARGIN_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="thumbPadding" type="text" default="-1" filter="integer" label="PLG_CONTENT_READLESSTEXT_THUMB_PADDING" description="PLG_CONTENT_READLESSTEXT_THUMB_PADDING_DESCRIPTION"></field>
        <field name="thumbBorderWidth" type="text" default="1" filter="integer" label="PLG_CONTENT_READLESSTEXT_THUMB_BORDER_WIDTH" description="PLG_CONTENT_READLESSTEXT_THUMB_BORDER_WIDTH_DESCRIPTION"></field>
        <field name="thumbBorderColor" type="text" default="#cccccc" filter="string" label="PLG_CONTENT_READLESSTEXT_THUMB_BORDER_COLOR" description="PLG_CONTENT_READLESSTEXT_THUMB_BORDER_COLOR_DESCRIPTION"></field>
        <field name="thumbBorderStyle" type="list" default="solid" filter="word" label="PLG_CONTENT_READLESSTEXT_THUMB_BORDER_STYLE" description="PLG_CONTENT_READLESSTEXT_THUMB_BORDER_STYLE_DESCRIPTION">
          <option value="dotted">Dotted</option>
          <option value="dashed">Dashed</option>
          <option value="solid">Solid</option>
          <option value="double">Double</option>
          <option value="groove">Groove</option>
          <option value="ridge">Ridge</option>
          <option value="inset">Inset</option>
          <option value="outset">Outset</option>
          <option value="none">None</option>
        </field>
        <field name="thumbClass" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_THUMB_CLASS" description="PLG_CONTENT_READLESSTEXT_THUMB_CLASS_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="thumbCacheTime" type="text" default="2419200" filter="integer" label="PLG_CONTENT_READLESSTEXT_THUMB_CACHE_TIME" description="PLG_CONTENT_READLESSTEXT_THUMB_CACHE_TIME_DESCRIPTION"></field>
        <field name="maxImageLoadTime" type="text" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_MAX_IMAGE_LOAD_TIME" description="PLG_CONTENT_READLESSTEXT_MAX_IMAGE_LOAD_TIME_DESCRIPTION"></field>
      </fieldset>      
      
      <fieldset name="prefix">
        <field name="addPrefix" type="list" default="when_active" filter="word" label="PLG_CONTENT_READLESSTEXT_ADD_PREFIX">
          <option value="no">JNO</option>
          <option value="when_active">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE</option>
          <option value="when_shortened">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_SHORTENED</option>
        </field>
        <field name="addPrefixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_ADD_PREFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="userPrefix" type="textarea" cols="30" rows="6" default="" filter="raw" label="PLG_CONTENT_READLESSTEXT_USER_PREFIX"></field>
        <field name="userPrefixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_USER_PREFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="userPrefixLinksToFullArticle" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_USER_PREFIX_LINKS_TO_FULL_ARTICLE" description="PLG_CONTENT_READLESSTEXT_USER_PREFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="guestPrefix" type="textarea" cols="30" rows="6" default="" filter="raw" label="PLG_CONTENT_READLESSTEXT_GUEST_PREFIX"></field>
        <field name="guestPrefixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="guestPrefixLinksToFullArticle" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_LINKS_TO_FULL_ARTICLE" description="PLG_CONTENT_READLESSTEXT_GUEST_PREFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="prefixDateFormat" type="text" default="[M, jS]" filter="raw" label="PLG_CONTENT_READLESSTEXT_DATE_FORMAT" description="PLG_CONTENT_READLESSTEXT_DATE_FORMAT_DESCRIPTION"></field>
      </fieldset>

      <fieldset name="suffix">
        <field name="addInlineSuffix" type="list" default="when_shortened" filter="word" label="PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX">
          <option value="no">JNO</option>
          <option value="when_active">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE</option>
          <option value="when_active_use_article_manager_option">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_USE_ARTICLE_MANAGER_OPTION</option>
          <option value="when_shortened">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_SHORTENED</option>
        </field>
        <field name="addInlineSuffixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_ADD_INLINE_SUFFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="userInlineSuffix" type="textarea" cols="30" rows="6" default="&amp;hellip;" filter="raw" label="PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX"></field>
        <field name="userInlineSuffixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="userInlineSuffixLinksToFullArticle" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE" description="PLG_CONTENT_READLESSTEXT_USER_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="guestInlineSuffix" type="textarea" cols="30" rows="6" default="&amp;hellip;" filter="raw" label="PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX"></field>
        <field name="guestInlineSuffixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="guestInlineSuffixLinksToFullArticle" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE" description="PLG_CONTENT_READLESSTEXT_GUEST_INLINE_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="" type="spacer" hr="true" />
        <field name="addSuffix" type="list" default="when_active_use_article_manager_option" filter="word" label="PLG_CONTENT_READLESSTEXT_ADD_SUFFIX">
          <option value="no">JNO</option>
          <option value="when_active">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE</option>
          <option value="when_active_use_article_manager_option">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_USE_ARTICLE_MANAGER_OPTION</option>
          <option value="when_shortened">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_SHORTENED</option>
        </field>
        <field name="addSuffixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_ADD_SUFFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="userSuffix" type="textarea" cols="30" rows="6" default="&lt;p class='readmore'&gt;&lt;a href='{url}'&gt;Read more: {title}&lt;/a>&lt;/p&gt;" filter="raw" label="PLG_CONTENT_READLESSTEXT_USER_SUFFIX"></field>
        <field name="userSuffixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_USER_SUFFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="userSuffixLinksToFullArticle" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_USER_SUFFIX_LINKS_TO_FULL_ARTICLE" description="PLG_CONTENT_READLESSTEXT_USER_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="guestSuffix" type="textarea" cols="30" rows="6" default="&lt;p class='readmore'&gt;&lt;a href='{url}'&gt;Read more: {title}&lt;/a>&lt;/p&gt;" filter="raw" label="PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX"></field>
        <field name="guestSuffixDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="guestSuffixLinksToFullArticle" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_LINKS_TO_FULL_ARTICLE" description="PLG_CONTENT_READLESSTEXT_GUEST_SUFFIX_LINKS_TO_FULL_ARTICLE_DESCRIPTION">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="" type="spacer" hr="true" />
        <field name="suffixDateFormat" type="text" default="[M, jS]" filter="raw" label="PLG_CONTENT_READLESSTEXT_DATE_FORMAT" description="PLG_CONTENT_READLESSTEXT_DATE_FORMAT_DESCRIPTION"></field>
      </fieldset>      

      <fieldset name="formatting">
        <field name="wrapperTag" type="list" default="0" filter="word" label="PLG_CONTENT_READLESSTEXT_WRAPPER_TAG" description="PLG_CONTENT_READLESSTEXT_WRAPPER_TAG_DESCRIPTION">
          <option value="0">JNO</option>
          <option value="article">article</option>
          <option value="div">div</option>
          <option value="section">section</option>
          <option value="span">span</option>
        </field>
        <field name="wrapperClass" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_WRAPPER_CLASS" description="PLG_CONTENT_READLESSTEXT_WRAPPER_CLASS_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="translateAdditions" type="radio" default="0" filter="integer" label="PLG_CONTENT_READLESSTEXT_TRANSLATE_ADDITIONS">
          <option value="1">JYES</option>
          <option value="0">JNO</option>
        </field>
        <field name="translateAdditionsDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_TRANSLATE_ADDITIONS_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />      
        <field name="extraSelfClosingTags" type="text" default="br, hr, img" filter="string" label="PLG_CONTENT_READLESSTEXT_EXTRA_SELF_CLOSING_TAGS" description="PLG_CONTENT_READLESSTEXT_EXTRA_SELF_CLOSING_TAGS_DESCRIPTION"></field>
        <field name="" type="spacer" hr="true" />
        <field name="applyFormatting" type="list" default="when_active" filter="word" label="PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING">
          <option value="when_active">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE</option>
          <option value="when_long_enough">PLG_CONTENT_READLESSTEXT_ALLOWED_WHEN_ACTIVE_AND_LONG_ENOUGH</option>
        </field>
        <field name="applyFormattingDescription" type="spacer" label="PLG_CONTENT_READLESSTEXT_APPLY_FORMATTING_DESCRIPTION" />
        <field name="" type="spacer" hr="true" />
        <field name="tagsToRemove" type="text" default="img" filter="string" label="PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE" description="PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_DESCRIPTION"></field>
        <field name="tagsToRemoveWithContents" type="text" default="style, nav, menu, footer, script, head, form, noscript" filter="string" label="PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_WITH_CONTENTS" description="PLG_CONTENT_READLESSTEXT_TAGS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION"></field>
        <field name="squareTokensToRemove" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE" description="PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_DESCRIPTION"></field>
        <field name="squareTokensToRemoveWithContents" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_WITH_CONTENTS" description="PLG_CONTENT_READLESSTEXT_SQUARE_TOKENS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION"></field>
        <field name="curlyTokensToRemove" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE" description="PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_DESCRIPTION"></field>
        <field name="curlyTokensToRemoveWithContents" type="text" default="" filter="string" label="PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_WITH_CONTENTS" description="PLG_CONTENT_READLESSTEXT_CURLY_TOKENS_TO_REMOVE_WITH_CONTENTS_DESCRIPTION"></field>
      </fieldset>
    </fields>
  </config>

  <files>
    <filename plugin="readlesstext">readlesstext.php</filename>
    <filename plugin="readlesstext">readlesstextcache.php</filename>
    <filename plugin="readlesstext">readlesstextexpand.php</filename>
    <filename plugin="readlesstext">readlesstexthelper.php</filename>
    <filename plugin="readlesstext">readlesstextmain.php</filename>
    <filename plugin="readlesstext">readlesstextthumb.php</filename>
    <folder>language</folder>
  </files>
  
  <scriptfile>script.php</scriptfile>

  <languages folder="language">
    <language tag="en-GB">en-GB/en-GB.plg_content_readlesstext.sys.ini</language>
    <language tag="en-GB">en-GB/en-GB.plg_content_readlesstext.ini</language>
    <language tag="nl-NL">nl-NL/nl-NL.plg_content_readlesstext.sys.ini</language>
    <language tag="nl-NL">nl-NL/nl-NL.plg_content_readlesstext.ini</language>
  </languages>

</extension>
PK�j&]ʹ���#readlesstext/readlesstextexpand.phpnu�[���<?php
/**
 * @package readlesstext
 * @copyright 2008-2014 Parvus
 * @license http://www.gnu.org/licenses/gpl-3.0.html
 * @link http://joomlacode.org/gf/project/cutoff/
 * @author Parvus
 *
 * readless 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.
 *
 * readless 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 readless. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @version $Id$
 */

defined( '_JEXEC' ) or die;
jimport( 'joomla.utilities.date' );
require_once 'readlesstexthelper.php';

class ReadLessTextExpand
{
  function __construct()
  {
    $this->_expandables[ '{author_id}' ] = 0;
    $this->_expandables[ '{author}' ] = '';
    $this->_expandables[ '{created}' ] = '';
    $this->_expandables[ '{modified}' ] = '';
    $this->_expandables[ '{publish_up}' ] = '';
    $this->_expandables[ '{hits}' ] = '';
    $this->_expandables[ '{title}' ] = '';
    $this->_expandables[ '{words}' ] = '';
  }

  /**
   * Prepares a future call to Expand(). Based on the given arguments, the
   * expandables are set. Existing exandables are overwritten.
   * @param JTableContent $article RO. The item/article being prepared for display. May be Null.
   * @param string $plaintext RO. The plain text version of the full,
   *   unshortened article. May be Null.
   * @param string $dateFormat Determines the format for the date fields to expand
   *   in the pre- and suffixes. May be Null.
   * @param $overrides Overrides information deduced from $article with given
   *   values. Keys are one of {author}, {author_id}, {words}, {created},
   *   {modified}, {publish_up}, {hits}, {category}, {category_id}, {id},
   *   {component}, {title}, {url}. May be Null.
   * @note {words} can only be expanded correctly if it is set via @c $overrides
   */
  public function SetExpandables( $article, $plaintext, $dateFormat, $overrides )
  {
    if ( $article )
    {
      /* {id} */
      $this->_expandables[ '{id}' ] = ReadLessTextHelper::GetArticleId( $article );

      /* {component} */
      $this->_expandables[ '{component}' ] = JRequest::getWord( 'option' );

      /* {category_id} */
      $this->_expandables[ '{category_id}' ] = ReadLessTextHelper::GetCategoryId( $article );

      /* {category} */
      if ( isset( $article->category_title ) )
      {
        $this->_expandables[ '{category}' ] = $article->category_title;
      }

      /* {author_id} */
      if ( isset( $article->created_by ) )
      {
        $this->_expandables[ '{author_id}' ] = $article->created_by;
      }

      /* {author} */
      if ( isset( $article->created_by_alias ) and $article->created_by_alias )
      {
        $this->_expandables[ '{author}' ] = $article->created_by_alias;
      }
      else if ( isset( $article->author ) and $article->author )
      {
        $this->_expandables[ '{author}' ] = $article->author;
      }

      /* {created} */
      if ( isset( $article->created ) )
      {
        $this->_created = new JDate( $article->created );
      }

      /* {modified} */
      if ( isset( $article->modified ) and ( $article->modified != '0000-00-00 00:00:00' ) )
      {
        $this->_modified = new JDate( $article->modified );
      }
      else
     {
        $this->_modified = $this->_created;
      }

      /* {publish_up} */
      if ( isset( $article->publish_up ) )
      {
        $this->_publishUp = new JDate( $article->publish_up );
      }

      /* {hits} */
      if ( isset( $article->hits ) )
      {
        $this->_expandables[ '{hits}' ] = $article->hits;
      }

      /* {title} */
      if ( isset( $article->title ) )
      {
        $this->_expandables[ '{title}' ] = $article->title;
      }
    }

    if ( $dateFormat )
    {
      if ( $this->_created )
      {
        $this->_expandables[ '{created}' ] = $this->_created->Format( $dateFormat );
      }
      if ( $this->_modified )
      {
        $this->_expandables[ '{modified}' ] = $this->_modified->Format( $dateFormat );
      }
      if ( $this->_publishUp )
      {
        $this->_expandables[ '{publish_up}' ] = $this->_publishUp->Format( $dateFormat );
      }
    }

    /* {words} must be set via $overrides */

    if ( $overrides )
    {
      $this->_expandables = array_merge( $this->_expandables, $overrides );
    }
  }

  /**
   * Expands the string according to the expandables, set in a previous call to SetExpandables
   * @param string $string
   */
  public function Expand( $string )
  {
    return JString::str_ireplace( array_keys( $this->_expandables ), array_values( $this->_expandables ), $string );
  }

  private $_expandables = array();
}
?>
PK�j&]��`�jj
vote/vote.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.vote
 *
 * @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;

/**
 * Vote plugin.
 *
 * @since  1.5
 */
class PlgContentVote extends JPlugin
{
	/**
	 * Application object
	 *
	 * @var    JApplicationCms
	 * @since  3.7.0
	 */
	protected $app;

	/**
	 * The position the voting data is displayed in relative to the article.
	 *
	 * @var    string
	 * @since  3.7.0
	 */
	protected $votingPosition;

	/**
	 * Constructor.
	 *
	 * @param   object  &$subject  The object to observe
	 * @param   array   $config    An optional associative array of configuration settings.
	 *
	 * @since   3.7.0
	 */
	public function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		$this->votingPosition = $this->params->get('position', 'top');
	}

	/**
	 * Displays the voting area when viewing an article and the voting section is displayed before the article
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   object   &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  string|boolean  HTML string containing code for the votes if in com_content else boolean false
	 *
	 * @since   1.6
	 */
	public function onContentBeforeDisplay($context, &$row, &$params, $page = 0)
	{
		if ($this->votingPosition !== 'top')
		{
			return '';
		}

		return $this->displayVotingData($context, $row, $params, $page);
	}

	/**
	 * Displays the voting area when viewing an article and the voting section is displayed after the article
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   object   &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  string|boolean  HTML string containing code for the votes if in com_content else boolean false
	 *
	 * @since   3.7.0
	 */
	public function onContentAfterDisplay($context, &$row, &$params, $page = 0)
	{
		if ($this->votingPosition !== 'bottom')
		{
			return '';
		}

		return $this->displayVotingData($context, $row, $params, $page);
	}

	/**
	 * Displays the voting area
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   object   &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  string|boolean  HTML string containing code for the votes if in com_content else boolean false
	 *
	 * @since   3.7.0
	 */
	private function displayVotingData($context, &$row, &$params, $page)
	{
		$parts = explode('.', $context);

		if ($parts[0] !== 'com_content')
		{
			return false;
		}

		if (empty($params) || !$params->get('show_vote', null))
		{
			return '';
		}

		// Load plugin language files only when needed (ex: they are not needed if show_vote is not active).
		$this->loadLanguage();

		// Get the path for the rating summary layout file
		$path = JPluginHelper::getLayoutPath('content', 'vote', 'rating');

		// Render the layout
		ob_start();
		include $path;
		$html = ob_get_clean();

		if ($this->app->input->getString('view', '') === 'article' && $row->state == 1)
		{
			// Get the path for the voting form layout file
			$path = JPluginHelper::getLayoutPath('content', 'vote', 'vote');

			// Render the layout
			ob_start();
			include $path;
			$html .= ob_get_clean();
		}

		return $html;
	}
}
PK�j&]m*�~~
vote/vote.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_vote</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>PLG_VOTE_XML_DESCRIPTION</description>
	<files>
		<filename plugin="vote">vote.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_vote.ini</language>
		<language tag="en-GB">en-GB.plg_content_vote.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="position"
					type="list"
					label="PLG_VOTE_POSITION_LABEL"
					description="PLG_VOTE_POSITION_DESC"
					default="top"
					>
					<option value="top">PLG_VOTE_TOP</option>
					<option value="bottom">PLG_VOTE_BOTTOM</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]^�y��vote/tmpl/vote.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.vote
 *
 * @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;

/**
 * Layout variables
 * -----------------
 * @var   string   $context  The context of the content being passed to the plugin
 * @var   object   &$row     The article object
 * @var   object   &$params  The article params
 * @var   integer  $page     The 'page' number
 * @var   array    $parts    The context segments
 * @var   string   $path     Path to this file
 */

$uri = clone JUri::getInstance();
$uri->setVar('hitcount', '0');

// Create option list for voting select box
$options = array();

for ($i = 1; $i < 6; $i++)
{
	$options[] = JHtml::_('select.option', $i, JText::sprintf('PLG_VOTE_VOTE', $i));
}

?>
<form method="post" action="<?php echo htmlspecialchars($uri->toString(), ENT_COMPAT, 'UTF-8'); ?>" class="form-inline">
	<span class="content_vote">
		<label class="unseen element-invisible" for="content_vote_<?php echo (int) $row->id; ?>"><?php echo JText::_('PLG_VOTE_LABEL'); ?></label>
		<?php echo JHtml::_('select.genericlist', $options, 'user_rating', null, 'value', 'text', '5', 'content_vote_' . (int) $row->id); ?>
		&#160;<input class="btn btn-mini" type="submit" name="submit_vote" value="<?php echo JText::_('PLG_VOTE_RATE'); ?>" />
		<input type="hidden" name="task" value="article.vote" />
		<input type="hidden" name="hitcount" value="0" />
		<input type="hidden" name="url" value="<?php echo htmlspecialchars($uri->toString(), ENT_COMPAT, 'UTF-8'); ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</span>
</form>
PK�j&]'��wwvote/tmpl/rating.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.vote
 *
 * @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;

/**
 * Layout variables
 * -----------------
 * @var   string   $context  The context of the content being passed to the plugin
 * @var   object   &$row     The article object
 * @var   object   &$params  The article params
 * @var   integer  $page     The 'page' number
 * @var   array    $parts    The context segments
 * @var   string   $path     Path to this file
 */

if ($context == 'com_content.categories')
{
	return;
}

$rating = (int) $row->rating;
$rcount = (int) $row->rating_count;

// Look for images in template if available
$starImageOn  = JHtml::_('image', 'system/rating_star.png', JText::_('PLG_VOTE_STAR_ACTIVE'), null, true);
$starImageOff = JHtml::_('image', 'system/rating_star_blank.png', JText::_('PLG_VOTE_STAR_INACTIVE'), null, true);

$img = '';

for ($i = 0; $i < $rating; $i++)
{
	$img .= $starImageOn;
}

for ($i = $rating; $i < 5; $i++)
{
	$img .= $starImageOff;
}

?>
<div class="content_rating">
	<?php if ($rcount) : ?>
		<p class="unseen element-invisible" itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
			<?php echo JText::sprintf('PLG_VOTE_USER_RATING', '<span itemprop="ratingValue">' . $rating . '</span>', '<span itemprop="bestRating">5</span>'); ?>
			<meta itemprop="ratingCount" content="<?php echo $rcount; ?>" />
			<meta itemprop="worstRating" content="1" />
		</p>
	<?php endif; ?>
	<?php echo $img; ?>
</div>
PK�j&]�)��vote/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�)��emailcloak/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&](q���emailcloak/emailcloak.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_emailcloak</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>PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION</description>
	<files>
		<filename plugin="emailcloak">emailcloak.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_emailcloak.ini</language>
		<language tag="en-GB">en-GB.plg_content_emailcloak.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="mode"
					type="list"
					label="PLG_CONTENT_EMAILCLOAK_MODE_LABEL"
					description="PLG_CONTENT_EMAILCLOAK_MODE_DESC"
					default="1"
					filter="integer"
					>
					<option value="0">PLG_CONTENT_EMAILCLOAK_NONLINKABLE</option>
					<option value="1">PLG_CONTENT_EMAILCLOAK_LINKABLE</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]tKh��D�Demailcloak/emailcloak.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.emailcloak
 *
 * @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;

/**
 * Email cloack plugin class.
 *
 * @since  1.5
 */
class PlgContentEmailcloak extends JPlugin
{
	/**
	 * Plugin that cloaks all emails in content from spambots via Javascript.
	 *
	 * @param   string   $context  The context of the content being passed to the plugin.
	 * @param   mixed    &$row     An object with a "text" property or the string to be cloaked.
	 * @param   mixed    &$params  Additional parameters. See {@see PlgContentEmailcloak()}.
	 * @param   integer  $page     Optional page number. Unused. Defaults to zero.
	 *
	 * @return  boolean	True on success.
	 */
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
		// Don't run this plugin when the content is being indexed
		if ($context === 'com_finder.indexer')
		{
			return true;
		}

		if (is_object($row))
		{
			return $this->_cloak($row->text, $params);
		}

		return $this->_cloak($row, $params);
	}

	/**
	 * Generate a search pattern based on link and text.
	 *
	 * @param   string  $link  The target of an email link.
	 * @param   string  $text  The text enclosed by the link.
	 *
	 * @return  string	A regular expression that matches a link containing the parameters.
	 */
	protected function _getPattern ($link, $text)
	{
		$pattern = '~(?:<a ([^>]*)href\s*=\s*"mailto:' . $link . '"([^>]*))>' . $text . '</a>~i';

		return $pattern;
	}

	/**
	 * Adds an attributes to the js cloaked email.
	 *
	 * @param   string  $jsEmail  Js cloaked email.
	 * @param   string  $before   Attributes before email.
	 * @param   string  $after    Attributes after email.
	 *
	 * @return string Js cloaked email with attributes.
	 */
	protected function _addAttributesToEmail($jsEmail, $before, $after)
	{
		if ($before !== '')
		{
			$before = str_replace("'", "\'", $before);
			$jsEmail = str_replace(".innerHTML += '<a '", ".innerHTML += '<a {$before}'", $jsEmail);
		}

		if ($after !== '')
		{
			$after = str_replace("'", "\'", $after);
			$jsEmail = str_replace("'\'>'", "'\'{$after}>'", $jsEmail);
		}

		return $jsEmail;
	}

	/**
	 * Cloak all emails in text from spambots via Javascript.
	 *
	 * @param   string  &$text    The string to be cloaked.
	 * @param   mixed   &$params  Additional parameters. Parameter "mode" (integer, default 1)
	 *                             replaces addresses with "mailto:" links if nonzero.
	 *
	 * @return  boolean  True on success.
	 */
	protected function _cloak(&$text, &$params)
	{
		/*
		 * Check for presence of {emailcloak=off} which is explicits disables this
		 * bot for the item.
		 */
		if (StringHelper::strpos($text, '{emailcloak=off}') !== false)
		{
			$text = StringHelper::str_ireplace('{emailcloak=off}', '', $text);

			return true;
		}

		// Simple performance check to determine whether bot should process further.
		if (StringHelper::strpos($text, '@') === false)
		{
			return true;
		}

		$mode = $this->params->def('mode', 1);

		// Example: any@example.org
		$searchEmail = '([\w\.\'\-\+]+\@(?:[a-z0-9\.\-]+\.)+(?:[a-zA-Z0-9\-]{2,24}))';

		// Example: any@example.org?subject=anyText
		$searchEmailLink = $searchEmail . '([?&][\x20-\x7f][^"<>]+)';

		// Any Text
		$searchText = '((?:[\x20-\x7f]|[\xA1-\xFF]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF4][\x80-\xBF]{3})[^<>]+)';

		// Any Image link
		$searchImage = '(<img[^>]+>)';

		// Any Text with <span or <strong
		$searchTextSpan = '(<span[^>]+>|<span>|<strong>|<strong><span[^>]+>|<strong><span>)' . $searchText . '(</span>|</strong>|</span></strong>)';

		// Any address with <span or <strong
		$searchEmailSpan = '(<span[^>]+>|<span>|<strong>|<strong><span[^>]+>|<strong><span>)' . $searchEmail . '(</span>|</strong>|</span></strong>)';

		/*
		 * Search and fix derivatives of link code <a href="http://mce_host/ourdirectory/email@example.org"
		 * >email@example.org</a>. This happens when inserting an email in TinyMCE, cancelling its suggestion to add
		 * the mailto: prefix...
		 */
		$pattern = $this->_getPattern($searchEmail, $searchEmail);
		$pattern = str_replace('"mailto:', '"http://mce_host([\x20-\x7f][^<>]+/)', $pattern);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[3][0];
			$mailText = $regs[5][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search and fix derivatives of link code <a href="http://mce_host/ourdirectory/email@example.org"
		 * >anytext</a>. This happens when inserting an email in TinyMCE, cancelling its suggestion to add
		 * the mailto: prefix...
		 */
		$pattern = $this->_getPattern($searchEmail, $searchText);
		$pattern = str_replace('"mailto:', '"http://mce_host([\x20-\x7f][^<>]+/)', $pattern);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[3][0];
			$mailText = $regs[5][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org"
		 * >email@example.org</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com"
		 * ><anyspan >email@amail.com</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchEmailSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . $regs[5][0] . $regs[6][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com">
		 * <anyspan >anytext</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchTextSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . addslashes($regs[5][0]) . $regs[6][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * anytext</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = addslashes($regs[4][0]);

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * <img anything></a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchImage);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * <img anything>email@example.org</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchImage . $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . $regs[5][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org">
		 * <img anything>any text</a>
		 */
		$pattern = $this->_getPattern($searchEmail, $searchImage . $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0];
			$mailText = $regs[4][0] . addslashes($regs[5][0]);

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[3][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org?
		 * subject=Text">email@example.org</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0];

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@example.org?
		 * subject=Text">anytext</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = addslashes($regs[5][0]);

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = $this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com?subject= Text"
		 * ><anyspan >email@amail.com</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchEmailSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0] . $regs[6][0] . $regs[7][0];

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code <a href="mailto:email@amail.com?subject= Text">
		 * <anyspan >anytext</anyspan></a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchTextSpan);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0] . addslashes($regs[6][0]) . $regs[7][0];

			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code
		 * <a href="mailto:email@amail.com?subject=Text"><img anything></a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchImage);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0] . $regs[2][0] . $regs[3][0];
			$mailText = $regs[5][0];

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code
		 * <a href="mailto:email@amail.com?subject=Text"><img anything>email@amail.com</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchImage . $searchEmail);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0] . $regs[2][0] . $regs[3][0];
			$mailText = $regs[4][0] . $regs[5][0] . $regs[6][0];

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for derivatives of link code
		 * <a href="mailto:email@amail.com?subject=Text"><img anything>any text</a>
		 */
		$pattern = $this->_getPattern($searchEmailLink, $searchImage . $searchText);

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0] . $regs[2][0] . $regs[3][0];
			$mailText = $regs[4][0] . $regs[5][0] . addslashes($regs[6][0]);

			// Needed for handling of Body parameter
			$mail = str_replace('&amp;', '&', $mail);

			// Check to see if mail text is different from mail addy
			$replacement = JHtml::_('email.cloak', $mail, $mode, $mailText, 0);

			// Ensure that attributes is not stripped out by email cloaking
			$replacement = html_entity_decode($this->_addAttributesToEmail($replacement, $regs[1][0], $regs[4][0]));

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[0][1], strlen($regs[0][0]));
		}

		/*
		 * Search for plain text email addresses, such as email@example.org but not within HTML tags:
		 * <img src="..." title="email@example.org"> or <input type="text" placeholder="email@example.org">
		 * The '<[^<]*>(*SKIP)(*F)|' trick is used to exclude this kind of occurrences
		 */
		$pattern = '~<[^<]*>(*SKIP)(*F)|' . $searchEmail . '~i';

		while (preg_match($pattern, $text, $regs, PREG_OFFSET_CAPTURE))
		{
			$mail = $regs[1][0];
			$replacement = JHtml::_('email.cloak', $mail, $mode);

			// Replace the found address with the js cloaked email
			$text = substr_replace($text, $replacement, $regs[1][1], strlen($mail));
		}

		return true;
	}
}
PK�j&]�)��finder/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]c|���finder/finder.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.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;

/**
 * Smart Search Content Plugin
 *
 * @since  2.5
 */
class PlgContentFinder extends JPlugin
{
	/**
	 * Smart Search after save content method.
	 * Content is passed by reference, but after the save, so no changes will be saved.
	 * Method is called right after the content is saved.
	 *
	 * @param   string  $context  The context of the content passed to the plugin (added in 1.6)
	 * @param   object  $article  A JTableContent object
	 * @param   bool    $isNew    If the content has just been created
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentAfterSave($context, $article, $isNew)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderAfterSave event.
		$dispatcher->trigger('onFinderAfterSave', array($context, $article, $isNew));
	}

	/**
	 * Smart Search before save content method.
	 * Content is passed by reference. Method is called before the content is saved.
	 *
	 * @param   string  $context  The context of the content passed to the plugin (added in 1.6).
	 * @param   object  $article  A JTableContent object.
	 * @param   bool    $isNew    If the content is just about to be created.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentBeforeSave($context, $article, $isNew)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderBeforeSave event.
		$dispatcher->trigger('onFinderBeforeSave', array($context, $article, $isNew));
	}

	/**
	 * Smart Search after delete content method.
	 * Content is passed by reference, but after the deletion.
	 *
	 * @param   string  $context  The context of the content passed to the plugin (added in 1.6).
	 * @param   object  $article  A JTableContent object.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function onContentAfterDelete($context, $article)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderAfterDelete event.
		$dispatcher->trigger('onFinderAfterDelete', array($context, $article));
	}

	/**
	 * Smart Search content state change method.
	 * Method to update the link information for items that have been changed
	 * from outside the edit screen. This is fired when the item is published,
	 * unpublished, archived, or unarchived from the list view.
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @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
	 */
	public function onContentChangeState($context, $pks, $value)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderChangeState event.
		$dispatcher->trigger('onFinderChangeState', array($context, $pks, $value));
	}

	/**
	 * Smart Search change category state content method.
	 * Method is called when the state of the category to which the
	 * content item belongs is changed.
	 *
	 * @param   string   $extension  The extension whose category has been updated.
	 * @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
	 */
	public function onCategoryChangeState($extension, $pks, $value)
	{
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('finder');

		// Trigger the onFinderCategoryChangeState event.
		$dispatcher->trigger('onFinderCategoryChangeState', array($extension, $pks, $value));
	}
}
PK�j&]4M�FFfinder/finder.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_finder</name>
	<author>Joomla! Project</author>
	<creationDate>December 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>PLG_CONTENT_FINDER_XML_DESCRIPTION</description>

	<files>
		<filename plugin="finder">finder.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_finder.ini</language>
		<language tag="en-GB">en-GB.plg_content_finder.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
		</fields>
	</config>
</extension>
PK�j&]�)��confirmconsent/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�5�77!confirmconsent/confirmconsent.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="content" method="upgrade">
	<name>plg_content_confirmconsent</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>PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION</description>
	<files>
		<filename plugin="confirmconsent">confirmconsent.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_confirmconsent.ini</language>
		<language tag="en-GB">en-GB.plg_content_confirmconsent.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic" addfieldpath="/administrator/components/com_content/models/fields">
				<field
					name="consentbox_text"
					type="textarea"
					label="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_LABEL"
					description="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DESC"
					hint="PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT"
					class="span12"
					rows="7"
					cols="20"
					filter="html"
				/>

				<field
					name="privacy_article"
					type="modal_article"
					label="PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_LABEL"
					description="PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_DESC"
					select="true"
					new="true"
					edit="true"
					clear="true"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]�p�|��!confirmconsent/confirmconsent.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.confirmconsent
 *
 * @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\Plugin\CMSPlugin;

/**
 * The Joomla Core confirm consent plugin
 *
 * @since  3.9.0
 */
class PlgContentConfirmConsent extends CMSPlugin
{
	/**
	 * The Application object
	 *
	 * @var    JApplicationSite
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * The supported form contexts
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $supportedContext = array(
		'com_contact.contact',
		'com_mailto.mailto',
		'com_privacy.request',
	);

	/**
	 * Add additional fields to the supported forms
	 *
	 * @param   JForm  $form  The form to be altered.
	 * @param   mixed  $data  The associated data for the form.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function onContentPrepareForm(JForm $form, $data)
	{
		if ($this->app->isClient('administrator') || !in_array($form->getName(), $this->supportedContext))
		{
			return true;
		}

		// Get the consent box Text & the selected privacyarticle
		$consentboxText  = (string) $this->params->get('consentbox_text', Text::_('PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT'));
		$privacyArticle  = $this->params->get('privacy_article', false);

		$form->load('
			<form>
				<fieldset name="default" addfieldpath="/plugins/content/confirmconsent/fields">
					<field
						name="consentbox"
						type="consentbox"
						articleid="' . $privacyArticle . '"
						label="PLG_CONTENT_CONFIRMCONSENT_CONSENTBOX_LABEL"
						required="true"
						>
						<option value="0">' . htmlspecialchars($consentboxText, ENT_COMPAT, 'UTF-8') . '</option>
					</field>
				</fieldset>
			</form>'
		);

		return true;
	}
}
PK�j&]P�Ltt$confirmconsent/fields/consentbox.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.confirmconsent
 *
 * @copyright   (C) 2018 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;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;

JFormHelper::loadFieldClass('Checkboxes');

/**
 * Consentbox Field class for the Confirm Consent Plugin.
 *
 * @since  3.9.1
 */
class JFormFieldConsentBox extends JFormFieldCheckboxes
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.1
	 */
	protected $type = 'ConsentBox';

	/**
	 * Flag to tell the field to always be in multiple values mode.
	 *
	 * @var    boolean
	 * @since  3.9.1
	 */
	protected $forceMultiple = false;

	/**
	 * The article ID.
	 *
	 * @var    integer
	 * @since  3.9.1
	 */
	protected $articleid;

	/**
	 * 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.9.1
	 */
	public function __set($name, $value)
	{
		switch ($name)
		{
			case 'articleid':
				$this->articleid = (int) $value;
				break;

			default:
				parent::__set($name, $value);
		}
	}

	/**
	 * 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.9.1
	 */
	public function __get($name)
	{
		switch ($name)
		{
			case 'articleid':
				return $this->$name;
		}

		return parent::__get($name);
	}

	/**
	 * 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.9.1
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		if ($return)
		{
			$this->articleid = (int) $this->element['articleid'];
		}

		return $return;
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 * @since   3.9.1
	 */
	protected function getLabel()
	{
		if ($this->hidden)
		{
			return '';
		}

		$data = $this->getLayoutData();

		// Forcing the Alias field to display the tip below
		$position = $this->element['name'] == 'alias' ? ' data-placement="bottom" ' : '';

		// When we have an article let's add the modal and make the title clickable
		if ($data['articleid'])
		{
			$attribs['data-toggle'] = 'modal';

			$data['label'] = HTMLHelper::_(
				'link',
				'#modal-' . $this->id,
				$data['label'],
				$attribs
			);
		}

		// Here mainly for B/C with old layouts. This can be done in the layouts directly
		$extraData = array(
			'text'     => $data['label'],
			'for'      => $this->id,
			'classes'  => explode(' ', $data['labelclass']),
			'position' => $position,
		);

		return $this->getRenderer($this->renderLabelLayout)->render(array_merge($data, $extraData));
	}

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.9.2
	 */
	protected function getInput()
	{
		$modalHtml  = '';
		$layoutData = $this->getLayoutData();

		if ($this->articleid)
		{
			$modalParams['title']  = $layoutData['label'];
			$modalParams['url']    = $this->getAssignedArticleUrl();
			$modalParams['height'] = 800;
			$modalParams['width']  = '100%';
			$modalHtml = HTMLHelper::_('bootstrap.renderModal', 'modal-' . $this->id, $modalParams);
		}

		return $modalHtml . parent::getInput();
	}

	/**
	 * Method to get the data to be passed to the layout for rendering.
	 *
	 * @return  array
	 *
	 * @since   3.9.1
	 */
	protected function getLayoutData()
	{
		$data = parent::getLayoutData();

		$extraData = array(
			'articleid' => (integer) $this->articleid,
		);

		return array_merge($data, $extraData);
	}

	/**
	 * Return the url of the assigned article based on the current user language
	 *
	 * @return  string  Returns the link to the article
	 *
	 * @since   3.9.1
	 */
	private function getAssignedArticleUrl()
	{
		$db = Factory::getDbo();

		// Get the info from the article
		$query = $db->getQuery(true)
			->select($db->quoteName(array('id', 'catid', 'language')))
			->from($db->quoteName('#__content'))
			->where($db->quoteName('id') . ' = ' . (int) $this->articleid);
		$db->setQuery($query);

		try
		{
			$article = $db->loadObject();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			// Something at the database layer went wrong
			return Route::_(
				'index.php?option=com_content&view=article&id='
				. $this->articleid . '&tmpl=component'
			);
		}

		if (!is_object($article))
		{
			// We have not found the article object lets show a 404 to the user
			return Route::_(
				'index.php?option=com_content&view=article&id='
				. $this->articleid . '&tmpl=component'
			);
		}

		// Register ContentHelperRoute
		JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');

		if (!Associations::isEnabled())
		{
			return Route::_(
				ContentHelperRoute::getArticleRoute(
					$article->id,
					$article->catid,
					$article->language
				) . '&tmpl=component'
			);
		}

		$associatedArticles = Associations::getAssociations('com_content', '#__content', 'com_content.item', $article->id);
		$currentLang        = Factory::getLanguage()->getTag();

		if (isset($associatedArticles) && $currentLang !== $article->language && array_key_exists($currentLang, $associatedArticles))
		{
			return Route::_(
				ContentHelperRoute::getArticleRoute(
					$associatedArticles[$currentLang]->id,
					$associatedArticles[$currentLang]->catid,
					$associatedArticles[$currentLang]->language
				) . '&tmpl=component'
			);
		}

		// Association is enabled but this article is not associated
		return Route::_(
			'index.php?option=com_content&view=article&id='
				. $article->id . '&catid=' . $article->catid
				. '&tmpl=component&lang=' . $article->language
		);
	}
}
PK�j&]�)��rsform/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�#o,,rsform/index.htmlnu�[���<html><body bgcolor="#FFFFFF"></body></html>PK�j&]�5JJrsform/script.phpnu�[���<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2015 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/

defined('_JEXEC') or die('Restricted access');

class plgContentRsformInstallerScript
{
	protected static $minJoomla = '3.7.0';
	protected static $minComponent = '3.0.0';
	
	public function preflight($type, $parent)
	{
		if ($type == 'uninstall')
		{
			return true;
		}

		try
		{
			$jversion = new JVersion();

			if (!$jversion->isCompatible(static::$minJoomla))
			{
				throw new Exception('Please upgrade to at least Joomla! ' . static::$minJoomla . ' before continuing!');
			}

			if (!file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/rsform.php'))
			{
				throw new Exception('Please install the RSForm! Pro component before continuing.');
			}

			if (!file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/assets.php') || !file_exists(JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/version.php'))
			{
				throw new Exception('Please upgrade RSForm! Pro to at least version ' . static::$minComponent . ' before continuing!');
			}

			require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/version.php';

			if (!class_exists('RSFormProVersion') || version_compare((string) new RSFormProVersion, static::$minComponent, '<'))
			{
				throw new Exception('Please upgrade RSForm! Pro to at least version ' . static::$minComponent . ' before continuing!');
			}
		}
		catch (Exception $e)
		{
			JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
			return false;
		}

		return true;
	}
	
	public function postflight($type, $parent) {
		if ($type == 'uninstall') {
			return true;
		}
		
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);
		$query->select('extension_id')
			  ->from($db->qn('#__extensions'))
			  ->where($db->qn('type').' = '.$db->q('plugin'))
			  ->where($db->qn('folder').' = '.$db->q('content'))
			  ->where($db->qn('element').' = '.$db->q('rsform'));
		$pluginId = $db->setQuery($query)->loadResult();
		?>
		<style type="text/css">
		.version-history {
			margin: 0 0 2em 0;
			padding: 0;
			list-style-type: none;
		}
		.version-history > li {
			margin: 0 0 0.5em 0;
			padding: 0 0 0 4em;
			text-align:left;
			font-weight:normal;
		}
		.version-new,
		.version-fixed,
		.version-upgraded {
			float: left;
			font-size: 0.8em;
			margin-left: -4.9em;
			width: 4.5em;
			color: white;
			text-align: center;
			font-weight: bold;
			text-transform: uppercase;
			-webkit-border-radius: 4px;
			-moz-border-radius: 4px;
			border-radius: 4px;
		}

		.version-new {
			background: #7dc35b;
		}
		.version-fixed {
			background: #e9a130;
		}
		.version-upgraded {
			background: #61b3de;
		}
		</style>

		<h3>RSForm! Pro Content Plugin v3.0.0 Changelog</h3>
		<ul class="version-history">
			<li><span class="version-upgraded">Upg</span> Joomla! 4.0 and RSForm! Pro 3.0 compatibility.</li>
		</ul>
		<?php if ($pluginId) { ?>
		<a class="btn btn-primary btn-large" href="<?php echo JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id='.$pluginId); ?>">Start using the RSForm! Pro Content Plugin.</a>
		<?php } ?>
		<a class="btn" href="https://www.rsjoomla.com/support/documentation/rsform-pro/plugins-and-modules/content-plugin-plgcontent-display-the-form-in-an-article.html" target="_blank">Read the documentation</a>
		<a class="btn btn-secondary" href="https://www.rsjoomla.com/support.html" target="_blank">Get Support!</a>
		<div style="clear: both;"></div>
		<?php
	}
}PK�j&]�S@##rsform/rsform.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="content" method="upgrade">
	<name>Content - RSForm! Pro</name>
	<author>RSJoomla!</author>
	<creationDate>June 2015</creationDate>
	<copyright>(C) 2007-2017 www.rsjoomla.com</copyright>
	<license>GNU General Public License</license>
	<authorEmail>support@rsjoomla.com</authorEmail>
	<authorUrl>www.rsjoomla.com</authorUrl>
	<version>3.0.0</version>
	<scriptfile>script.php</scriptfile>
	
	<updateservers>
        <server type="extension" priority="1" name="RSForm! Pro - Content Plugin">https://www.rsjoomla.com/updates/com_rsform/Plugins/plg_content.xml</server>
    </updateservers>
	
	<description><![CDATA[PLG_CONTENT_RSFORM_DESC]]></description>
	<files>
		<filename plugin="rsform">rsform.php</filename>
		<filename>index.html</filename>
	</files>
	<languages folder="language/en-GB">
		<language tag="en-GB">en-GB.plg_content_rsform.ini</language>
		<language tag="en-GB">en-GB.plg_content_rsform.sys.ini</language>
	</languages>
</extension>PK�j&]��}r

rsform/rsform.phpnu�[���<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2015 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/

defined('_JEXEC') or die('Restricted access');

class plgContentRsform extends JPlugin
{
	// Joomla! Triggers - onContentPrepare()
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
		// Don't run this plugin when the content is being indexed
		if ($context == 'com_finder.indexer')
		{
			return true;
		}

		if (is_object($row) && isset($row->text))
		{
			$this->_addForm($row->text);
		}
		elseif (is_string($row))
		{
			$this->_addForm($row);
		}
	}
	
	// Syntax replacement function
	private function _addForm(&$text)
	{
		// Performance check
		if (strpos($text, '{rsform ') === false)
		{
			return false;
		}

		if (!class_exists('RSFormProHelper'))
		{
			$helper = JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/rsform.php';
			if (!file_exists($helper))
			{
				return false;
			}

			require_once $helper;
		}

		// Expression to search for
		$pattern = '#\{rsform ([0-9]+)(.*?)?\}#i';
		// Found matches
		if (preg_match_all($pattern, $text, $matches))
		{
			// No replacement when we're not dealing with HTML
			if (JFactory::getDocument()->getType() != 'html')
			{
				$text = preg_replace($pattern, '', $text);
				return true;
			}

			// Load language
			JFactory::getLanguage()->load('com_rsform', JPATH_SITE);

			// Disable caching
			JFactory::getCache('com_content')->setCaching(false);

			foreach ($matches[0] as $i => $fullMatch)
			{
				$attributes = trim($matches[2][$i]);
				if (strlen($attributes) && preg_match_all('#[a-z0-9_\-]+=".*?"#i', $attributes, $attributesMatches))
				{
					$data = array();

					foreach ($attributesMatches[0] as $pair)
					{
						list($attribute, $value) = explode('=', $pair, 2);

						$attribute  = trim(html_entity_decode($attribute));
						$value 		= html_entity_decode(trim($value, '"'));

						if (isset($data[$attribute]))
						{
							if (!is_array($data[$attribute]))
							{
								$data[$attribute] = (array) $data[$attribute];
							}

							$data[$attribute][] = $value;
						}
						else
						{
							$data[$attribute] = $value;
						}
					}

					if ($data)
					{
						JFactory::getApplication()->input->get->set('form', $data);
					}
				}

				$formId = $matches[1][$i];
				$text = str_replace($fullMatch, RSFormProHelper::displayForm($formId, true), $text);
			}
		}

		return true;
	}
}PK�j&]'/�"�"joomla/joomla.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.joomla
 *
 * @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;

/**
 * Example Content Plugin
 *
 * @since  1.6
 */
class PlgContentJoomla extends JPlugin
{
	/**
	 * Example after save content method
	 * Article is passed by reference, but after the save, so no changes will be saved.
	 * Method is called right after the content is saved
	 *
	 * @param   string   $context  The context of the content passed to the plugin (added in 1.6)
	 * @param   object   $article  A JTableContent object
	 * @param   boolean  $isNew    If the content is just about to be created
	 *
	 * @return  boolean   true if function not enabled, is in frontend or is new. Else true or
	 *                    false depending on success of save function.
	 *
	 * @since   1.6
	 */
	public function onContentAfterSave($context, $article, $isNew)
	{
		// Check we are handling the frontend edit form.
		if ($context !== 'com_content.form')
		{
			return true;
		}

		// Check if this function is enabled.
		if (!$this->params->def('email_new_fe', 1))
		{
			return true;
		}

		// Check this is a new article.
		if (!$isNew)
		{
			return true;
		}

		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__users'))
			->where($db->quoteName('sendEmail') . ' = 1')
			->where($db->quoteName('block') . ' = 0');
		$db->setQuery($query);
		$users = (array) $db->loadColumn();

		if (empty($users))
		{
			return true;
		}

		$user = JFactory::getUser();

		// Messaging for new items
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_messages/models', 'MessagesModel');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_messages/tables');

		$default_language = JComponentHelper::getParams('com_languages')->get('administrator');
		$debug = JFactory::getConfig()->get('debug_lang');
		$result = true;

		foreach ($users as $user_id)
		{
			if ($user_id != $user->id)
			{
				// Load language for messaging
				$receiver = JUser::getInstance($user_id);
				$lang = JLanguage::getInstance($receiver->getParam('admin_language', $default_language), $debug);
				$lang->load('com_content');
				$message = array(
					'user_id_to' => $user_id,
					'subject' => $lang->_('COM_CONTENT_NEW_ARTICLE'),
					'message' => sprintf($lang->_('COM_CONTENT_ON_NEW_CONTENT'), $user->get('name'), $article->title)
				);
				$model_message = JModelLegacy::getInstance('Message', 'MessagesModel');
				$result = $model_message->save($message);
			}
		}

		return $result;
	}

	/**
	 * Don't allow categories to be deleted if they contain items or subcategories with items
	 *
	 * @param   string  $context  The context for the content passed to the plugin.
	 * @param   object  $data     The data relating to the content that was deleted.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function onContentBeforeDelete($context, $data)
	{
		// Skip plugin if we are deleting something other than categories
		if ($context !== 'com_categories.category')
		{
			return true;
		}

		// Check if this function is enabled.
		if (!$this->params->def('check_categories', 1))
		{
			return true;
		}

		$extension = JFactory::getApplication()->input->getString('extension');

		// Default to true if not a core extension
		$result = true;

		$tableInfo = array(
			'com_banners' => array('table_name' => '#__banners'),
			'com_contact' => array('table_name' => '#__contact_details'),
			'com_content' => array('table_name' => '#__content'),
			'com_newsfeeds' => array('table_name' => '#__newsfeeds'),
			'com_weblinks' => array('table_name' => '#__weblinks')
		);

		// Now check to see if this is a known core extension
		if (isset($tableInfo[$extension]))
		{
			// Get table name for known core extensions
			$table = $tableInfo[$extension]['table_name'];

			// See if this category has any content items
			$count = $this->_countItemsInCategory($table, $data->get('id'));

			// Return false if db error
			if ($count === false)
			{
				$result = false;
			}
			else
			{
				// Show error if items are found in the category
				if ($count > 0)
				{
					$msg = JText::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title'))
						. JText::plural('COM_CATEGORIES_N_ITEMS_ASSIGNED', $count);
					JError::raiseWarning(403, $msg);
					$result = false;
				}

				// Check for items in any child categories (if it is a leaf, there are no child categories)
				if (!$data->isLeaf())
				{
					$count = $this->_countItemsInChildren($table, $data->get('id'), $data);

					if ($count === false)
					{
						$result = false;
					}
					elseif ($count > 0)
					{
						$msg = JText::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED', $data->get('title'))
							. JText::plural('COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS', $count);
						JError::raiseWarning(403, $msg);
						$result = false;
					}
				}
			}

			return $result;
		}
	}

	/**
	 * Get count of items in a category
	 *
	 * @param   string   $table  table name of component table (column is catid)
	 * @param   integer  $catid  id of the category to check
	 *
	 * @return  mixed  count of items found or false if db error
	 *
	 * @since   1.6
	 */
	private function _countItemsInCategory($table, $catid)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);

		// Count the items in this category
		$query->select('COUNT(id)')
			->from($table)
			->where('catid = ' . $catid);
		$db->setQuery($query);

		try
		{
			$count = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return false;
		}

		return $count;
	}

	/**
	 * Get count of items in a category's child categories
	 *
	 * @param   string   $table  table name of component table (column is catid)
	 * @param   integer  $catid  id of the category to check
	 * @param   object   $data   The data relating to the content that was deleted.
	 *
	 * @return  mixed  count of items found or false if db error
	 *
	 * @since   1.6
	 */
	private function _countItemsInChildren($table, $catid, $data)
	{
		$db = JFactory::getDbo();

		// Create subquery for list of child categories
		$childCategoryTree = $data->getTree();

		// First element in tree is the current category, so we can skip that one
		unset($childCategoryTree[0]);
		$childCategoryIds = array();

		foreach ($childCategoryTree as $node)
		{
			$childCategoryIds[] = $node->id;
		}

		// Make sure we only do the query if we have some categories to look in
		if (count($childCategoryIds))
		{
			// Count the items in this category
			$query = $db->getQuery(true)
				->select('COUNT(id)')
				->from($table)
				->where('catid IN (' . implode(',', $childCategoryIds) . ')');
			$db->setQuery($query);

			try
			{
				$count = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				JError::raiseWarning(500, $e->getMessage());

				return false;
			}

			return $count;
		}
		else
			// If we didn't have any categories to check, return 0
		{
			return 0;
		}
	}

	/**
	 * Change the state in core_content if the state in a table is changed
	 *
	 * @param   string   $context  The context for the content passed to the plugin.
	 * @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  boolean
	 *
	 * @since   3.1
	 */
	public function onContentChangeState($context, $pks, $value)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('core_content_id'))
			->from($db->quoteName('#__ucm_content'))
			->where($db->quoteName('core_type_alias') . ' = ' . $db->quote($context))
			->where($db->quoteName('core_content_item_id') . ' IN (' . $pksImploded = implode(',', $pks) . ')');
		$db->setQuery($query);
		$ccIds = $db->loadColumn();

		$cctable = new JTableCorecontent($db);
		$cctable->publish($ccIds, $value);

		return true;
	}

	/**
	* The save event.
	*
	* @param   string   $context  The context
	* @param   object   $table    The item
	* @param   boolean  $isNew    Is new item
	*
	* @return  void
	*
	* @since   3.9.12
	*/
	public function onContentBeforeSave($context, $table, $isNew)
	{
		// Check we are handling the frontend edit form.
		if ($context !== 'com_menus.item')
		{
			return true;
		}

		// Special case for Create article menu item
		if ($table->link !== 'index.php?option=com_content&view=form&layout=edit')
		{
			return true;
		}

		// Display error if catid is not set when enable_category is enabled
		$params = json_decode($table->params, true);

		if ($params['enable_category'] == 1 && empty($params['catid']))
		{
			$table->setError(JText::_('COM_CONTENT_CREATE_ARTICLE_ERROR'));

			return false;
		}
	}
}
PK�j&]�|f..joomla/joomla.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_joomla</name>
	<author>Joomla! Project</author>
	<creationDate>November 2010</creationDate>
	<copyright>(C) 2010 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>PLG_CONTENT_JOOMLA_XML_DESCRIPTION</description>
	<files>
		<filename plugin="joomla">joomla.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_joomla.ini</language>
		<language tag="en-GB">en-GB.plg_content_joomla.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="check_categories"
					type="radio"
					label="PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_LABEL"
					description="PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field 
					name="email_new_fe"
					type="radio"
					label="PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_LABEL"
					description="PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_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>
PK�j&]�)��joomla/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]�)��fields/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]��ig``fields/fields.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.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();

/**
 * Plug-in to show a custom field in eg an article
 * This uses the {fields ID} syntax
 *
 * @since  3.7.0
 */
class PlgContentFields extends JPlugin
{
	/**
	 * Plugin that shows a custom field
	 *
	 * @param   string  $context  The context of the content being passed to the plugin.
	 * @param   object  &$item    The item object.  Note $article->text is also available
	 * @param   object  &$params  The article params
	 * @param   int     $page     The 'page' number
	 *
	 * @return void
	 *
	 * @since  3.7.0
	 */
	public function onContentPrepare($context, &$item, &$params, $page = 0)
	{
		// If the item has a context, overwrite the existing one
		if ($context == 'com_finder.indexer' && !empty($item->context))
		{
			$context = $item->context;
		}
		elseif ($context == 'com_finder.indexer')
		{
			// Don't run this plugin when the content is being indexed and we have no real context
			return;
		}

		// Don't run if there is no text property (in case of bad calls) or it is empty
		if (empty($item->text))
		{
			return;
		}

		// Simple performance check to determine whether bot should process further
		if (strpos($item->text, 'field') === false)
		{
			return;
		}

		// Register FieldsHelper
		JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

		// Prepare the text
		if (isset($item->text))
		{
			$item->text = $this->prepare($item->text, $context, $item);
		}

		// Prepare the intro text
		if (isset($item->introtext))
		{
			$item->introtext = $this->prepare($item->introtext, $context, $item);
		}
	}

	/**
	 * Prepares the given string by parsing {field} and {fieldgroup} groups and replacing them.
	 *
	 * @param   string  $string   The text to prepare
	 * @param   string  $context  The context of the content
	 * @param   object  $item     The item object
	 *
	 * @return string
	 *
	 * @since  3.8.1
	 */
	private function prepare($string, $context, $item)
	{
		// Search for {field ID} or {fieldgroup ID} tags and put the results into $matches.
		$regex = '/{(field|fieldgroup)\s+(.*?)}/i';
		preg_match_all($regex, $string, $matches, PREG_SET_ORDER);

		if (!$matches)
		{
			return $string;
		}

		$parts = FieldsHelper::extract($context);

		if (count($parts) < 2)
		{
			return $string;
		}

		$context    = $parts[0] . '.' . $parts[1];
		$fields     = FieldsHelper::getFields($context, $item, true);
		$fieldsById = array();
		$groups     = array();

		// Rearranging fields in arrays for easier lookup later.
		foreach ($fields as $field)
		{
			$fieldsById[$field->id]     = $field;
			$groups[$field->group_id][] = $field;
		}

		foreach ($matches as $i => $match)
		{
			// $match[0] is the full pattern match, $match[1] is the type (field or fieldgroup) and $match[2] the ID and optional the layout
			$explode = explode(',', $match[2]);
			$id      = (int) $explode[0];
			$output  = '';

			if ($match[1] == 'field' && $id)
			{
				if (isset($fieldsById[$id]))
				{
					$layout = !empty($explode[1]) ? trim($explode[1]) : $fieldsById[$id]->params->get('layout', 'render');
					$output = FieldsHelper::render(
						$context,
						'field.' . $layout,
						array(
							'item'    => $item,
							'context' => $context,
							'field'   => $fieldsById[$id]
						)
					);
				}
			}
			else
			{
				if ($match[2] === '*')
				{
					$match[0]     = str_replace('*', '\*', $match[0]);
					$renderFields = $fields;
				}
				else
				{
					$renderFields = isset($groups[$id]) ? $groups[$id] : '';
				}

				if ($renderFields)
				{
					$layout = !empty($explode[1]) ? trim($explode[1]) : 'render';
					$output = FieldsHelper::render(
						$context,
						'fields.' . $layout,
						array(
							'item'    => $item,
							'context' => $context,
							'fields'  => $renderFields
						)
					);
				}
			}

			$string = preg_replace("|$match[0]|", addcslashes($output, '\\$'), $string, 1);
		}

		return $string;
	}
}
PK�j&]���qqfields/fields.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7.0" type="plugin" group="content" method="upgrade">
	<name>plg_content_fields</name>
	<author>Joomla! Project</author>
	<creationDate>February 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>PLG_CONTENT_FIELDS_XML_DESCRIPTION</description>
	<files>
		<filename plugin="fields">fields.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_fields.ini</language>
		<language tag="en-GB">en-GB.plg_content_fields.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]�)��pagenavigation/.htaccessnu��6�$<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>PK�j&]@4pagenavigation/tmpl/default.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagenavigation
 *
 * @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');

$lang = JFactory::getLanguage();

?>
<ul class="pager pagenav">
<?php if ($row->prev) :
	$direction = $lang->isRtl() ? 'right' : 'left'; ?>
	<li class="previous">
		<a class="hasTooltip" title="<?php echo htmlspecialchars($rows[$location-1]->title); ?>" aria-label="<?php echo JText::sprintf('JPREVIOUS_TITLE', htmlspecialchars($rows[$location-1]->title)); ?>" href="<?php echo $row->prev; ?>" rel="prev">
			<?php echo '<span class="icon-chevron-' . $direction . '" aria-hidden="true"></span> <span aria-hidden="true">' . $row->prev_label . '</span>'; ?>
		</a>
	</li>
<?php endif; ?>
<?php if ($row->next) :
	$direction = $lang->isRtl() ? 'left' : 'right'; ?>
	<li class="next">
		<a class="hasTooltip" title="<?php echo htmlspecialchars($rows[$location+1]->title); ?>" aria-label="<?php echo JText::sprintf('JNEXT_TITLE', htmlspecialchars($rows[$location+1]->title)); ?>" href="<?php echo $row->next; ?>" rel="next">
			<?php echo '<span aria-hidden="true">' . $row->next_label . '</span> <span class="icon-chevron-' . $direction . '" aria-hidden="true"></span>'; ?>
		</a>
	</li>
<?php endif; ?>
</ul>
PK�j&]f�;��!pagenavigation/pagenavigation.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="content" method="upgrade">
	<name>plg_content_pagenavigation</name>
	<author>Joomla! Project</author>
	<creationDate>January 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>PLG_PAGENAVIGATION_XML_DESCRIPTION</description>
	<files>
		<filename plugin="pagenavigation">pagenavigation.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.plg_content_pagenavigation.ini</language>
		<language tag="en-GB">en-GB.plg_content_pagenavigation.sys.ini</language>
	</languages>
	<config>
		<fields name="params">

			<fieldset name="basic">
				<field
					name="position"
					type="list"
					label="PLG_PAGENAVIGATION_FIELD_POSITION_LABEL"
					description="PLG_PAGENAVIGATION_FIELD_POSITION_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_BELOW</option>
					<option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_ABOVE</option>
				</field>

				<field
					name="relative"
					type="list"
					label="PLG_PAGENAVIGATION_FIELD_RELATIVE_LABEL"
					description="PLG_PAGENAVIGATION_FIELD_RELATIVE_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_ARTICLE</option>
					<option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_TEXT</option>
				</field>

				<field
					name="display"
					type="list"
					label="PLG_PAGENAVIGATION_FIELD_DISPLAY_LABEL"
					description="PLG_PAGENAVIGATION_FIELD_DISPLAY_DESC"
					default="0"
					filter="integer"
					>
					<option value="0">PLG_PAGENAVIGATION_FIELD_VALUE_NEXTPREV</option>
					<option value="1">PLG_PAGENAVIGATION_FIELD_VALUE_TITLE</option>
				</field>

			</fieldset>
		</fields>
	</config>
</extension>
PK�j&]:k��!pagenavigation/pagenavigation.phpnu�[���<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagenavigation
 *
 * @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('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php');

/**
 * Pagenavigation plugin class.
 *
 * @since  1.5
 */
class PlgContentPagenavigation extends JPlugin
{
	/**
	 * If in the article view and the parameter is enabled shows the page navigation
	 *
	 * @param   string   $context  The context of the content being passed to the plugin
	 * @param   object   &$row     The article object
	 * @param   mixed    &$params  The article params
	 * @param   integer  $page     The 'page' number
	 *
	 * @return  mixed  void or true
	 *
	 * @since   1.6
	 */
	public function onContentBeforeDisplay($context, &$row, &$params, $page = 0)
	{
		$app   = JFactory::getApplication();
		$view  = $app->input->get('view');
		$print = $app->input->getBool('print');

		if ($print)
		{
			return false;
		}

		if ($context === 'com_content.article' && $view === 'article' && $params->get('show_item_navigation'))
		{
			$db       = JFactory::getDbo();
			$user     = JFactory::getUser();
			$lang     = JFactory::getLanguage();
			$nullDate = $db->getNullDate();

			$date = JFactory::getDate();
			$now  = $date->toSql();

			$uid        = $row->id;
			$option     = 'com_content';
			$canPublish = $user->authorise('core.edit.state', $option . '.article.' . $row->id);

			/**
			 * The following is needed as different menu items types utilise a different param to control ordering.
			 * For Blogs the `orderby_sec` param is the order controlling param.
			 * For Table and List views it is the `orderby` param.
			**/
			$params_list = $params->toArray();

			if (array_key_exists('orderby_sec', $params_list))
			{
				$order_method = $params->get('orderby_sec', '');
			}
			else
			{
				$order_method = $params->get('orderby', '');
			}

			// Additional check for invalid sort ordering.
			if ($order_method === 'front')
			{
				$order_method = '';
			}

			// Get the order code
			$orderDate = $params->get('order_date');
			$queryDate = $this->getQueryDate($orderDate);

			// Determine sort order.
			switch ($order_method)
			{
				case 'date' :
					$orderby = $queryDate;
					break;
				case 'rdate' :
					$orderby = $queryDate . ' DESC ';
					break;
				case 'alpha' :
					$orderby = 'a.title';
					break;
				case 'ralpha' :
					$orderby = 'a.title DESC';
					break;
				case 'hits' :
					$orderby = 'a.hits';
					break;
				case 'rhits' :
					$orderby = 'a.hits DESC';
					break;
				case 'order' :
					$orderby = 'a.ordering';
					break;
				case 'author' :
					$orderby = 'a.created_by_alias, u.name';
					break;
				case 'rauthor' :
					$orderby = 'a.created_by_alias DESC, u.name DESC';
					break;
				case 'front' :
					$orderby = 'f.ordering';
					break;
				default :
					$orderby = 'a.ordering';
					break;
			}

			$xwhere = ' AND (a.state = 1 OR a.state = -1)'
				. ' AND (publish_up = ' . $db->quote($nullDate) . ' OR publish_up <= ' . $db->quote($now) . ')'
				. ' AND (publish_down = ' . $db->quote($nullDate) . ' OR publish_down >= ' . $db->quote($now) . ')';

			// Array of articles in same category correctly ordered.
			$query = $db->getQuery(true);

			// Sqlsrv changes
			$case_when = ' CASE WHEN ' . $query->charLength('a.alias', '!=', '0');
			$a_id = $query->castAsChar('a.id');
			$case_when .= ' THEN ' . $query->concatenate(array($a_id, 'a.alias'), ':');
			$case_when .= ' ELSE ' . $a_id . ' END as slug';

			$case_when1 = ' CASE WHEN ' . $query->charLength('cc.alias', '!=', '0');
			$c_id = $query->castAsChar('cc.id');
			$case_when1 .= ' THEN ' . $query->concatenate(array($c_id, 'cc.alias'), ':');
			$case_when1 .= ' ELSE ' . $c_id . ' END as catslug';
			$query->select('a.id, a.title, a.catid, a.language,' . $case_when . ',' . $case_when1)
				->from('#__content AS a')
				->join('LEFT', '#__categories AS cc ON cc.id = a.catid');

			if ($order_method === 'author' || $order_method === 'rauthor')
			{
				$query->select('a.created_by, u.name');
				$query->join('LEFT', '#__users AS u ON u.id = a.created_by');
			}

			$query->where(
					'a.catid = ' . (int) $row->catid . ' AND a.state = ' . (int) $row->state
						. ($canPublish ? '' : ' AND a.access IN (' . implode(',', JAccess::getAuthorisedViewLevels($user->id)) . ') ') . $xwhere
				);
			$query->order($orderby);

			if ($app->isClient('site') && $app->getLanguageFilter())
			{
				$query->where('a.language in (' . $db->quote($lang->getTag()) . ',' . $db->quote('*') . ')');
			}

			$db->setQuery($query);
			$list = $db->loadObjectList('id');

			// This check needed if incorrect Itemid is given resulting in an incorrect result.
			if (!is_array($list))
			{
				$list = array();
			}

			reset($list);

			// Location of current content item in array list.
			$location = array_search($uid, array_keys($list));
			$rows     = array_values($list);

			$row->prev = null;
			$row->next = null;

			if ($location - 1 >= 0)
			{
				// The previous content item cannot be in the array position -1.
				$row->prev = $rows[$location - 1];
			}

			if (($location + 1) < count($rows))
			{
				// The next content item cannot be in an array position greater than the number of array postions.
				$row->next = $rows[$location + 1];
			}

			if ($row->prev)
			{
				$row->prev_label = ($this->params->get('display', 0) == 0) ? JText::_('JPREV') : $row->prev->title;
				$row->prev = JRoute::_(ContentHelperRoute::getArticleRoute($row->prev->slug, $row->prev->catid, $row->prev->language));
			}
			else
			{
				$row->prev_label = '';
				$row->prev = '';
			}

			if ($row->next)
			{
				$row->next_label = ($this->params->get('display', 0) == 0) ? JText::_('JNEXT') : $row->next->title;
				$row->next = JRoute::_(ContentHelperRoute::getArticleRoute($row->next->slug, $row->next->catid, $row->next->language));
			}
			else
			{
				$row->next_label = '';
				$row->next = '';
			}

			// Output.
			if ($row->prev || $row->next)
			{
				// Get the path for the layout file
				$path = JPluginHelper::getLayoutPath('content', 'pagenavigation');

				// Render the pagenav
				ob_start();
				include $path;
				$row->pagination = ob_get_clean();

				$row->paginationposition = $this->params->get('position', 1);

				// This will default to the 1.5 and 1.6-1.7 behavior.
				$row->paginationrelative = $this->params->get('relative', 0);
			}
		}
	}

	/**
	 * Translate an order code to a field for primary ordering.
	 *
	 * @param   string  $orderDate  The ordering code.
	 *
	 * @return  string  The SQL field(s) to order by.
	 *
	 * @since   3.3
	 */
	private static function getQueryDate($orderDate)
	{
		$db = JFactory::getDbo();

		switch ($orderDate)
		{
			// Use created if modified is not set
			case 'modified' :
				$queryDate = ' CASE WHEN a.modified = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.modified END';
				break;

			// Use created if publish_up is not set
			case 'published' :
				$queryDate = ' CASE WHEN a.publish_up = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.publish_up END ';
				break;

			// Use created as default
			case 'created' :
			default :
				$queryDate = ' a.created ';
				break;
		}

		return $queryDate;
	}
}
PK�j&]�)��pagebreak/.htaccessnu��6�$PK�j&]f ph���pagebreak/tmpl/toc.phpnu�[���PK�j&]�54س��pagebreak/tmpl/navigation.phpnu�[���PK�j&]��^�	pagebreak/pagebreak.xmlnu�[���PK�j&]}$*�%�%\pagebreak/pagebreak.phpnu�[���PK�j&]�)���;contact/.htaccessnu��6�$PK�j&]=�S���X<contact/contact.phpnu�[���PK�j&]�=�bb�Icontact/contact.xmlnu�[���PK�j&]�)��8Ploadmodule/.htaccessnu��6�$PK�j&]�[z6���Ploadmodule/loadmodule.xmlnu�[���PK�j&]Ձ�$���Vloadmodule/loadmodule.phpnu�[���PK�j&]�)��	�q.htaccessnu��6�$PK�j&]�F�3�rjce/jce.phpnu�[���PK�j&]�Ȭ���tjce/jce.xmlnu�[���PK�j&]�)��
�xjce/.htaccessnu��6�$PK�j&]�<��cyjce/css/media.cssnu&1i�PK�j&]�#o,,azjce/css/index.htmlnu&1i�PK�j&]�)���zreadlesstext/.htaccessnu��6�$PK�j&]q��e�]�]"�{readlesstext/readlesstextthumb.phpnu�[���PK�j&]Jp!��m�m#��readlesstext/readlesstexthelper.phpnu�[���PK�j&]Q�=�� � cGreadlesstext/script.phpnu�[���PK�j&]b%J�^�^�!�hreadlesstext/readlesstextmain.phpnu�[���PK�j&]D�c6ee"FVreadlesstext/readlesstextcache.phpnu�[���PK�j&]Ō��%�%B�mreadlesstext/language/en-GB/en-GB.plg_content_readlesstext.sys.ininu�[���PK�j&]�h��a�a�>G�readlesstext/language/en-GB/en-GB.plg_content_readlesstext.ininu�[���PK�j&]��T���Bmreadlesstext/language/nl-NL/nl-NL.plg_content_readlesstext.sys.ininu�[���PK�j&]܍4<��>vreadlesstext/language/nl-NL/nl-NL.plg_content_readlesstext.ininu�[���PK�j&])�O
�
�
�ureadlesstext/readlesstext.phpnu�[���PK�j&]��N�
`
`��readlesstext/readlesstext.xmlnu�[���PK�j&]ʹ���#��readlesstext/readlesstextexpand.phpnu�[���PK�j&]��`�jj
��vote/vote.phpnu�[���PK�j&]m*�~~
�vote/vote.xmlnu�[���PK�j&]^�y��Xvote/tmpl/vote.phpnu�[���PK�j&]'��wwIvote/tmpl/rating.phpnu�[���PK�j&]�)��vote/.htaccessnu��6�$PK�j&]�)���emailcloak/.htaccessnu��6�$PK�j&](q����emailcloak/emailcloak.xmlnu�[���PK�j&]tKh��D�D�emailcloak/emailcloak.phpnu�[���PK�j&]�)���dfinder/.htaccessnu��6�$PK�j&]c|����efinder/finder.phpnu�[���PK�j&]4M�FF�ufinder/finder.xmlnu�[���PK�j&]�)��<yconfirmconsent/.htaccessnu��6�$PK�j&]�5�77!zconfirmconsent/confirmconsent.xmlnu�[���PK�j&]�p�|��!��confirmconsent/confirmconsent.phpnu�[���PK�j&]P�Ltt$ˆconfirmconsent/fields/consentbox.phpnu�[���PK�j&]�)����rsform/.htaccessnu��6�$PK�j&]�#o,,I�rsform/index.htmlnu�[���PK�j&]�5JJ��rsform/script.phpnu�[���PK�j&]�S@##A�rsform/rsform.xmlnu�[���PK�j&]��}r

��rsform/rsform.phpnu�[���PK�j&]'/�"�"�joomla/joomla.phpnu�[���PK�j&]�|f..$�joomla/joomla.xmlnu�[���PK�j&]�)����joomla/.htaccessnu��6�$PK�j&]�)��R�fields/.htaccessnu��6�$PK�j&]��ig``�fields/fields.phpnu�[���PK�j&]���qq��fields/fields.xmlnu�[���PK�j&]�)��dpagenavigation/.htaccessnu��6�$PK�j&]@4+pagenavigation/tmpl/default.phpnu�[���PK�j&]f�;��!�pagenavigation/pagenavigation.xmlnu�[���PK�j&]:k��!,pagenavigation/pagenavigation.phpnu�[���PK<<��-