$v) {
$jqfx[] = ['text' => $v, 'value' => $k];
}
return [
'name' => tra('Mouseover'),
'documentation' => 'PluginMouseover',
'description' => tra('Display hidden content by mousing over text'),
'prefs' => [ 'wikiplugin_mouseover' ],
'body' => tra('Hidden content, unless the label parameter is undefined, in which case this is the label.'),
'iconname' => 'comment',
'introduced' => 3,
'tags' => [ 'basic' ],
'params' => [
'label' => [
'required' => true,
'name' => tra('Label'),
'description' => tra('Text displayed on the page. The body is the hidden content.'),
'since' => '3.0',
'filter' => 'text',
'default' => '',
],
'url' => [
'required' => false,
'name' => tra('URL'),
'description' => tra('Destination link when mouseover text is clicked. Use http:// for external links'),
'since' => '3.0',
'filter' => 'url',
'default' => 'javascript:void(0)',
],
'text' => [
'required' => false,
'name' => tra('Text'),
'description' => tra('DEPRECATED') . ' ' . tra('Hidden content. The body contains the label.'),
'since' => '3.0',
'filter' => 'text',
'default' => '',
'advanced' => true,
],
'width' => [
'required' => false,
'name' => tra('Width'),
'description' => tr('Mouseover box width. Default: %0400px%1', '', ''),
'since' => '3.0',
'filter' => 'digits',
'default' => 400,
'advanced' => true,
],
'height' => [
'required' => false,
'name' => tra('Height'),
'description' => tr('Mouseover box height. Default: %0200px%1', '', ''),
'since' => '3.0',
'filter' => 'digits',
'default' => 200,
'advanced' => true,
],
'offsetx' => [
'required' => false,
'name' => tra('Offset X'),
'description' => tr('Shifts the overlay to the right by the specified number of pixels relative to
the cursor. Default: %05%1', '', ''),
'since' => '3.0',
'filter' => 'int',
'default' => 5,
'advanced' => true,
],
'offsety' => [
'required' => false,
'name' => tra('Offset Y'),
'description' => tr('Shifts the overlay lower by the specified number of pixels relative to the
cursor. Default: %00%1', '', ''),
'since' => '3.0',
'filter' => 'int',
'default' => 24,
'advanced' => true,
],
'parse' => [
'required' => false,
'name' => tra('Parse Body'),
'description' => tra('Parse the body of the plugin as wiki content (parsed by default)'),
'since' => '3.0',
'filter' => 'alpha',
'advanced' => true,
'default' => 'y',
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n']
]
],
'parselabel' => [
'required' => false,
'name' => tra('Parse Label'),
'description' => tra('Parse the label as wiki content (parsed by default)'),
'since' => '5.0',
'filter' => 'alpha',
'default' => 'y',
'advanced' => true,
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n']
]
],
'class' => [
'required' => false,
'name' => tra('CSS Class'),
'description' => tra('CSS class to apply'),
'since' => '4.0',
'filter' => 'text',
'default' => 'plugin-mouseover',
'advanced' => true,
],
'bgcolor' => [
'required' => false,
'name' => tra('Background Color'),
'description' => tra('Background color to apply to the popup'),
'since' => '3.0',
'filter' => 'text',
'default' => '',
'advanced' => true,
],
'textcolor' => [
'required' => false,
'name' => tra('Text Color'),
'description' => tra('Color to apply to the text in the popup'),
'since' => '3.0',
'filter' => 'text',
'default' => '',
'advanced' => true,
],
'sticky' => [
'required' => false,
'name' => tra('Sticky'),
'description' => tra('When enabled, popup stays visible until it is clicked.'),
'since' => '3.0',
'filter' => 'alpha',
'default' => '',
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n']
],
'advanced' => true,
],
'padding' => [
'required' => false,
'name' => tra('Padding'),
'description' => tra('Padding size in pixels'),
'since' => '3.0',
'filter' => 'digits',
'default' => '',
'advanced' => true,
],
'effect' => [
'required' => false,
'name' => tra('Effect'),
'options' => $jqfx,
'description' => tra('Set the type of show/hide animation that will be used'),
'since' => '4.0',
'filter' => 'text',
'advanced' => true,
],
'speed' => [
'required' => false,
'name' => tra('Effect Speed'),
'options' => [
['text' => tra('Normal'), 'value' => ''],
['text' => tra('Fast'), 'value' => 'fast'],
['text' => tra('Slow'), 'value' => 'slow'],
],
'description' => tra('Set the speed of the animation.'),
'since' => '4.0',
'filter' => 'alpha',
'default' => '',
'advanced' => true,
],
'closeDelay' => [
'required' => false,
'name' => tra('Close Delay'),
'description' => tra('Number of seconds before popup closes'),
'since' => '5.0',
'filter' => 'digits',
'default' => 0,
'advanced' => true,
],
'tag' => [
'required' => false,
'name' => tra('Tag'),
'description' => tr('HTML tag to use for the label. Default %0a%1', '', ''),
'since' => '9.2',
'filter' => 'word',
'default' => 'a',
'advanced' => true,
],
],
];
}
function wikiplugin_mouseover($data, $params)
{
$default = ['parse' => 'y', 'parselabel' => 'y'];
$params = array_merge($default, $params);
$width = isset($params['width']) ? (int) $params['width'] : 400;
$height = isset($params['height']) ? (int) $params['height'] : 200;
$offsetx = isset($params['offsetx']) ? (int) $params['offsetx'] : 5;
$offsety = isset($params['offsety']) ? (int) $params['offsety'] : 24;
$parse = ! isset($params['parse']) || (strcasecmp($params['parse'], 'n') != 0);
$sticky = isset($params['sticky']) && $params['sticky'] == 'y';
$padding = isset($params['padding']) ? 'padding: ' . $params['padding'] . 'px;' : '';
$effect = ! isset($params['effect']) || $params['effect'] == 'Default' ? '' : strtolower($params['effect']);
$speed = ! isset($params['speed']) ? 'normal' : strtolower($params['speed']);
$closeDelay = isset($params['closeDelay']) ? (int) $params['closeDelay'] : 0;
$tag = ! empty($params['tag']) ? $params['tag'] : 'a';
if (empty($params['label']) && empty($params['text'])) {
$label = tra('No label specified');
} else {
$label = ! empty($params['label']) ? $params['label'] : $data;
$text = ! empty($params['text']) ? $params['text'] : $data;
}
$url = '';
if (isset($params['url'])) {
$url = $params['url'];
$url = htmlentities($url, ENT_QUOTES, 'UTF-8');
}
$text = trim($text);
if (empty($text)) {
if ($params['parselabel'] == 'y') {
return $label;
} else {
return "~np~$label~/np~";
}
}
if ($parse) {
$options = ['is_html' => 0];
if (containsStringHTML($text)) {
$options = ['is_html' => 1];
}
$text = TikiLib::lib('parser')->parse_data($text, $options);
}
if ($params['parselabel'] == 'y') {
$label = "~/np~$label~np~";
}
static $lastval = 0;
$id = "mo" . ++$lastval;
$headerlib = TikiLib::lib('header');
$headerlib->add_css('.plugin-mouseover-anchor:not([href]) { border-bottom: 1px dotted; color: inherit; cursor: help; text-decoration: none; }');
if ($closeDelay && $sticky) {
$closeDelayStr = "setTimeout(function() {hideJQ('#$id', '$effect', '$speed')}, " . ($closeDelay * 1000) . ");";
} else {
$closeDelayStr = '';
}
$js = "\$('#$id-link').mouseover(function(event) {
var pos = $(this).position();
$(this).closest('td').css('position', 'relative');
\$('#$id').css('position', 'absolute').css('left', pos.left + $offsetx + 'px').css('top', pos.top + $offsety + 'px');
showJQ('#$id', '$effect', '$speed'); $closeDelayStr });
";
if ($sticky) {
$js .= "\$('#$id').click(function(event) { hideJQ('#$id', '$effect', '$speed'); }).css('cursor','pointer');\n";
} else {
$js .= "\$('#$id-link').mouseout(function(event) { setTimeout(function() {hideJQ('#$id', '$effect', '$speed')}, " . ($closeDelay * 1000) . "); });";
}
$headerlib->add_jq_onready($js);
$bgcolor = isset($params['bgcolor']) ? ("background-color: " . $params['bgcolor'] . ';') : '';
$textcolor = isset($params['textcolor']) ? ("color:" . $params['textcolor'] . ';') : '';
$class = ! isset($params['class']) ? 'class="plugin-mouseover"' : 'class="plugin-mouseover ' . $params['class'] . '"';
$href = $url ? 'href="' . $url . '"' : '';
$html = "~np~<$tag id=\"$id-link\" $href class=\"plugin-mouseover-anchor\">$label$tag>" .
"$text~/np~";
return $html;
}
function containsStringHTML($str)
{
return preg_match('/<[^>]*>/', $str) == 1;
}