Server : LiteSpeed System : Linux server 3.10.0-1160.90.1.el7.x86_64 #1 SMP Thu May 4 15:21:22 UTC 2023 x86_64 User : alsaif ( 1057) PHP Version : 7.4.33 Disable Function : show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/alsaif/domains/alsaif.group/private_html/libraries/regularlabs/src/ |
<?php
/**
* @package Regular Labs Library
* @version 23.9.3039
*
* @author Peter van Westen <info@regularlabs.com>
* @link https://regularlabs.com
* @copyright Copyright © 2023 Regular Labs All Rights Reserved
* @license GNU General Public License version 2 or later
*/
namespace RegularLabs\Library;
defined('_JEXEC') or die;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;
use RegularLabs\Library\ParametersNew as Parameters;
class Form
{
public static function getAddToLoadAjaxListScript($field, $name, $value, $id, $attributes = [], $simple = false)
{
$attributes['field'] = $field;
$attributes['name'] = $name;
$attributes['value'] = $value;
$attributes['id'] = $id;
$url = 'index.php?option=com_ajax&plugin=regularlabs&format=raw'
. '&' . Uri::createCompressedAttributes(json_encode($attributes));
$remove_spinner = "$('#" . $id . "_spinner').remove();";
$replace_field = "$('#" . $id . "').replaceWith(data);";
$init_chosen = 'document.getElementById("' . $id . '") && document.getElementById("' . $id . '").nodeName == "SELECT" && $("#' . $id . '").chosen();';
$success = $replace_field;
if ($simple)
{
$success .= $init_chosen;
}
else
{
Document::script('regularlabs/multiselect.min.js');
Document::stylesheet('regularlabs/multiselect.min.css');
$success .= "if(data.indexOf('rl_multiselect') > -1)\{RegularLabsMultiSelect.init($('#" . $id . "'));\} else { " . $init_chosen . "}";
}
// $success .= "console.log('#" . $id . "');";
// $success .= "console.log(data);";
$error = $remove_spinner;
$success = "if(data)\{" . $success . "\}" . $remove_spinner;
$script = "jQuery(document).ready(function() {"
. "RegularLabsScripts.addToLoadAjaxList("
. "'" . addslashes($url) . "',"
. "'" . addslashes($success) . "',"
. "'" . addslashes($error) . "'"
. ")"
. "});";
return '<script>' . $script . '</script>';
}
public static function getOptionsCount($options)
{
$count = 0;
foreach ($options as $option)
{
$count++;
if ( ! empty($option->links))
{
$count += self::getOptionsCount($option->links);
}
}
return $count;
}
/**
* Prepare the string for a select form field item
*
* @param string $string
* @param int $published
* @param string $type
* @param int $remove_first
*
* @return string
*/
public static function prepareSelectItem($string, $published = 1, $type = '', $remove_first = 0)
{
if (empty($string))
{
return '';
}
$string = str_replace([' ', ' '], ' ', $string);
$string = RegEx::replace('- ', ' ', $string);
for ($i = 0; $remove_first > $i; $i++)
{
$string = RegEx::replace('^ ', '', $string, '');
}
if (RegEx::match('^( *)(.*)$', $string, $match, ''))
{
[$string, $pre, $name] = $match;
$pre = str_replace(' ', ' · ', $pre);
$pre = RegEx::replace('(( · )*) · ', '\1 » ', $pre);
$pre = str_replace(' ', ' ', $pre);
$string = $pre . $name;
}
switch (true)
{
case ($type == 'separator'):
$string = '[[:font-weight:normal;font-style:italic;color:grey;:]]' . $string;
break;
case ($published == -2):
$string = '[[:font-style:italic;color:grey;:]]' . $string . ' [' . JText::_('JTRASHED') . ']';
break;
case ($published == 0):
$string = '[[:font-style:italic;color:grey;:]]' . $string . ' [' . JText::_('JUNPUBLISHED') . ']';
break;
case ($published == 2):
$string = '[[:font-style:italic;:]]' . $string . ' [' . JText::_('JARCHIVED') . ']';
break;
}
return $string;
}
/**
* Render a full select list
*
* @param array $options
* @param string $name
* @param string $value
* @param string $id
* @param int $size
* @param bool $multiple
* @param bool $simple
* @param bool $readonly
* @param bool $ignore_max_count
*
* @return string
*/
public static function selectList(&$options, $name, $value, $id, $size = 0, $multiple = false, $simple = false, $readonly = false, $ignore_max_count = false)
{
if (empty($options))
{
return '<fieldset class="radio">' . JText::_('RL_NO_ITEMS_FOUND') . '</fieldset>';
}
if ( ! $multiple)
{
$simple = true;
}
$params = Parameters::getPlugin('regularlabs');
$value = ArrayHelper::toArray($value);
$value = ArrayHelper::clean($value);
if (count($value) === 1 && strpos($value[0], ',') !== false)
{
$value = ArrayHelper::toArray($value[0]);
}
$count = 0;
if ($options != -1)
{
foreach ($options as $option)
{
$count++;
if (isset($option->links))
{
$count += count($option->links);
}
if ( ! $ignore_max_count && $count > $params->max_list_count)
{
break;
}
}
}
if ($options == -1 || ( ! $ignore_max_count && $count > $params->max_list_count))
{
if (is_array($value))
{
$value = implode(',', $value);
}
if ( ! $value)
{
$input = '<textarea name="' . $name . '" id="' . $id . '" cols="40" rows="5">' . $value . '</textarea>';
}
else
{
$input = '<input type="text" name="' . $name . '" id="' . $id . '" value="' . $value . '" size="60">';
}
$plugin = JPluginHelper::getPlugin('system', 'regularlabs');
$url = ! empty($plugin->id)
? 'index.php?option=com_plugins&task=plugin.edit&extension_id=' . $plugin->id
: 'index.php?option=com_plugins&filter_folder=&filter_search=Regular%20Labs%20Library';
$label = JText::_('RL_ITEM_IDS');
$text = JText::_('RL_MAX_LIST_COUNT_INCREASE');
$tooltip = JText::_('RL_MAX_LIST_COUNT_INCREASE_DESC,' . $params->max_list_count . ',RL_MAX_LIST_COUNT');
$link = '<a href="' . $url . '" target="_blank" id="' . $id . '_msg"'
. ' class="hasPopover" title="' . $text . '" data-content="' . htmlentities($tooltip) . '">'
. '<span class="icon icon-cog"></span>'
. $text
. '</a>';
$script = 'jQuery("#' . $id . '_msg").popover({"html": true,"trigger": "hover focus","container": "body"})';
return '<fieldset class="radio">'
. '<label for="' . $id . '">' . $label . ':</label>'
. $input
. '<br><small>' . $link . '</small>'
. '</fieldset>'
. '<script>' . $script . '</script>';
}
if ($simple)
{
$first_level = $options[0]->level ?? 0;
foreach ($options as &$option)
{
if ( ! isset($option->level))
{
continue;
}
$repeat = ($option->level - $first_level > 0) ? $option->level - $first_level : 0;
if ( ! $repeat)
{
continue;
}
//$option->text = str_repeat(' - ', $repeat) . $option->text;
$option->text = '[[:padding-left: ' . (5 + ($repeat * 15)) . 'px;:]]' . $option->text;
}
}
if ( ! $multiple)
{
$attr = 'class="inputbox"';
if ($readonly)
{
$attr .= ' readonly="readonly"';
}
if (is_array(reset($options)) && isset(reset($options)['items']))
{
return JHtml::_(
'select.groupedlist', $options, $name,
[
'id' => $id,
'group.id' => 'id',
'list.attr' => $attr,
'list.select' => $value,
]
);
}
$html = JHtml::_('select.genericlist', $options, $name, $attr, 'value', 'text', $value, $id);
return self::handlePreparedStyles($html);
}
$size = (int) $size ?: 300;
if ($simple)
{
$attr = 'style="width: ' . $size . 'px" multiple="multiple"';
if ($readonly)
{
$attr .= ' readonly="readonly"';
}
if (substr($name, -2) !== '[]')
{
$name .= '[]';
}
if (is_array(reset($options)) && isset(reset($options)['items']))
{
return JHtml::_(
'select.groupedlist', $options, $name,
[
'id' => $id,
'group.id' => 'id',
'list.attr' => trim($attr),
'list.select' => $value,
]
);
}
$html = JHtml::_('select.genericlist', $options, $name, trim($attr), 'value', 'text', $value, $id);
return self::handlePreparedStyles($html);
}
Language::load('com_modules', JPATH_ADMINISTRATOR);
Document::script('regularlabs/multiselect.min.js');
Document::stylesheet('regularlabs/multiselect.min.css');
$count_total = self::getOptionsCount($options);
$count_selected = count($value);
$has_nested = $count_total > count($options);
$html = [];
$html[] = '<div class="well well-small rl_multiselect" id="' . $id . '">';
$html[] = '<div class="form-inline rl_multiselect-controls">';
$html[] = '<span class="small">' . JText::_('JSELECT') . ':
<a class="rl_multiselect-checkall" href="javascript:;">' . JText::_('JALL') . '</a>
<span class="ghosted">[' . $count_total . ']</span>,
<a class="rl_multiselect-uncheckall" href="javascript:;">' . JText::_('JNONE') . '</a>,
<a class="rl_multiselect-toggleall" href="javascript:;">' . JText::_('RL_TOGGLE') . '</a>
</span>';
$html[] = '<span> | </span>';
if ($has_nested)
{
$html[] = '<span class="small">' . JText::_('RL_EXPAND') . ':
<a class="rl_multiselect-expandall" href="javascript:;">' . JText::_('JALL') . '</a>,
<a class="rl_multiselect-collapseall" href="javascript:;">' . JText::_('JNONE') . '</a>
</span>';
$html[] = '<span> | </span>';
}
$html[] = '<span class="small">' . JText::_('JSHOW') . ':
<a class="rl_multiselect-showall" href="javascript:;">' . JText::_('JALL') . '</a>
<span class="ghosted">[' . $count_total . ']</span>,
<a class="rl_multiselect-showselected" href="javascript:;">' . JText::_('RL_SELECTED') . '</a>
<span class="ghosted">[<span class="rl_multiselect-count-selected">' . $count_selected . '</span>]</span>
</span>';
$html[] = '<span class="rl_multiselect-maxmin">
<span> | </span>
<span class="small">
<a class="rl_multiselect-maximize" href="javascript:;">' . JText::_('RL_MAXIMIZE') . '</a>
<a class="rl_multiselect-minimize" style="display:none;" href="javascript:;">' . JText::_('RL_MINIMIZE') . '</a>
</span>
</span>';
$html[] = '<input type="text" name="rl_multiselect-filter" class="rl_multiselect-filter input-medium search-query pull-right" size="16"
autocomplete="off" placeholder="' . JText::_('JSEARCH_FILTER') . '" aria-invalid="false" tabindex="-1">';
$html[] = '</div>';
$html[] = '<hr class="hr-condensed">';
$o = [];
foreach ($options as $option)
{
$option->level ??= 0;
$o[] = $option;
if (isset($option->links))
{
foreach ($option->links as $link)
{
$link->level = $option->level + ($link->level ?? 1);
$o[] = $link;
}
}
}
$html[] = '<ul class="rl_multiselect-ul" style="max-height:300px;min-width:' . $size . 'px;overflow-x: hidden;">';
$prevlevel = 0;
foreach ($o as $i => $option)
{
if ($prevlevel < $option->level)
{
// correct wrong level indentations
$option->level = $prevlevel + 1;
$html[] = '<ul class="rl_multiselect-sub">';
}
elseif ($prevlevel > $option->level)
{
$html[] = str_repeat('</li></ul>', $prevlevel - $option->level);
}
elseif ($i)
{
$html[] = '</li>';
}
$labelclass = trim('pull-left ' . ($option->labelclass ?? ''));
$html[] = '<li>';
$item = '<div class="' . trim('rl_multiselect-item pull-left ' . ($option->class ?? '')) . '">';
if (isset($option->title))
{
$labelclass .= ' nav-header';
}
if (isset($option->title) && ( ! isset($option->value) || ! $option->value))
{
$item .= '<label class="' . $labelclass . '">' . $option->title . '</label>';
}
else
{
$selected = in_array($option->value, $value) ? ' checked="checked"' : '';
$disabled = (isset($option->disable) && $option->disable) ? ' disabled="disabled"' : '';
if (empty($option->hide_select))
{
$item .= '<input type="checkbox" class="pull-left" name="' . $name . '" id="' . $id . $option->value . '" value="' . $option->value . '"' . $selected . $disabled . '>';
}
$item .= '<label for="' . $id . $option->value . '" class="' . $labelclass . '">' . $option->text . '</label>';
}
$item .= '</div>';
$html[] = $item;
if ( ! isset($o[$i + 1]) && $option->level > 0)
{
$html[] = str_repeat('</li></ul>', (int) $option->level);
}
$prevlevel = $option->level;
}
$html[] = '</ul>';
$html[] = '
<div style="display:none;" class="rl_multiselect-menu-block">
<div class="pull-left nav-hover rl_multiselect-menu">
<div class="btn-group">
<a href="#" data-toggle="dropdown" class="dropdown-toggle btn btn-micro">
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li class="nav-header">' . JText::_('COM_MODULES_SUBITEMS') . '</li>
<li class="divider"></li>
<li class=""><a class="checkall" href="javascript:;"><span class="icon-checkbox"></span> ' . JText::_('JSELECT') . '</a>
</li>
<li><a class="uncheckall" href="javascript:;"><span class="icon-checkbox-unchecked"></span> ' . JText::_('COM_MODULES_DESELECT') . '</a>
</li>
<div class="rl_multiselect-menu-expand">
<li class="divider"></li>
<li><a class="expandall" href="javascript:;"><span class="icon-plus"></span> ' . JText::_('RL_EXPAND') . '</a></li>
<li><a class="collapseall" href="javascript:;"><span class="icon-minus"></span> ' . JText::_('RL_COLLAPSE') . '</a></li>
</div>
</ul>
</div>
</div>
</div>';
$html[] = '</div>';
$html = implode('', $html);
return self::handlePreparedStyles($html);
}
/**
* Render a select list loaded via Ajax
*
* @param string $field
* @param string $name
* @param string $value
* @param string $id
* @param array $attributes
* @param bool $simple
*
* @return string
*/
public static function selectListAjax($field, $name, $value, $id, $attributes = [], $simple = false)
{
JHtml::_('jquery.framework');
$script = self::getAddToLoadAjaxListScript($field, $name, $value, $id, $attributes, $simple);
if (is_array($value))
{
$value = implode(',', $value);
}
Document::script('regularlabs/script.min.js');
Document::stylesheet('regularlabs/style.min.css');
$input = '<textarea name="' . $name . '" id="' . $id . '" cols="40" rows="5">' . $value . '</textarea>'
. '<div id="' . $id . '_spinner" class="rl_spinner"></div>';
return $input . $script;
}
/**
* Render a simple select list
*
* @param array $options
* @param $string $name
* @param string $value
* @param string $id
* @param int $size
* @param bool $multiple
* @param bool $readonly
* @param bool $ignore_max_count
*
* @return string
*/
public static function selectListSimple(&$options, $name, $value, $id, $size = 0, $multiple = false, $readonly = false, $ignore_max_count = false)
{
return self::selectlist($options, $name, $value, $id, $size, $multiple, true, $readonly, $ignore_max_count);
}
/**
* Render a simple select list loaded via Ajax
*
* @param string $field
* @param string $name
* @param string $value
* @param string $id
* @param array $attributes
*
* @return string
*/
public static function selectListSimpleAjax($field, $name, $value, $id, $attributes = [])
{
return self::selectListAjax($field, $name, $value, $id, $attributes, true);
}
/**
* Replace style placeholders with actual style attributes
*
* @param string $string
*
* @return string
*/
private static function handlePreparedStyles($string)
{
// No placeholders found
if (strpos($string, '[[:') === false)
{
return $string;
}
// Doing following replacement in 3 steps to prevent the Regular Expressions engine from exploding
// Replace style tags right after the html tags
$string = RegEx::replace(
';?:\]\]\s*\[\[:',
';',
$string
);
$string = RegEx::replace(
'>\s*\[\[\:(.*?)\:\]\]',
' style="\1">',
$string
);
// No more placeholders found
if (strpos($string, '[[:') === false)
{
return $string;
}
// Replace style tags prepended with a minus and any amount of whitespace: '- '
$string = RegEx::replace(
'>((?:-\s*)+)\[\[\:(.*?)\:\]\]',
' style="\2">\1',
$string
);
// No more placeholders found
if (strpos($string, '[[:') === false)
{
return $string;
}
// Replace style tags prepended with whitespace, a minus and any amount of whitespace: ' - '
$string = RegEx::replace(
'>((?:\s+-\s*)+)\[\[\:(.*?)\:\]\]',
' style="\2">\1',
$string
);
return $string;
}
}